gets()是否忽略'\ 0'?

lzutao

我正在学习使用此源代码的缓冲区溢出:

#include <stdio.h>
int main()
{
    char buf[16];
    gets(buf);
    printf("buf @ %8p\n", (void*)&buf);
    return 0;
}

我尝试将Null字符('\ 0')写入buf变量。

首先,在中gdb,在gets()函数之后的第6行设置断点,并使用r <<< $(python -c 'print "\0"*11 + "AAAA"')

当我探索堆栈时,我意识到它只向写入“ AAAA” buf怎么了?

(gdb) x/16xw &buf
0xffffcf80: 0x41414141  0xffffd000  0xffffd04c  0x080484a1
0xffffcf90: 0xf7fb43dc  0xffffcfb0  0x00000000  0xf7e1a637
0xffffcfa0: 0xf7fb4000  0xf7fb4000  0x00000000  0xf7e1a637
0xffffcfb0: 0x00000001  0xffffd044  0xffffd04c  0x00000000

但是,当我使用运行程序时r <<< $(python -c 'print "\1"*11 + "AAAA"')buf将是:

(gdb) x/16xw &buf
0xffffcf80: 0x01010101  0x01010101  0x41010101  0x00414141
0xffffcf90: 0xf7fb43dc  0xffffcfb0  0x00000000  0xf7e1a637
0xffffcfa0: 0xf7fb4000  0xf7fb4000  0x00000000  0xf7e1a637
0xffffcfb0: 0x00000001  0xffffd044  0xffffd04c  0x00000000

因此,该gets()函数将不会接收该Null字符或stdin将其忽略吗?

P / S:我gcc -m32 -fno-stack-protector -g stack.c -o stack在gcc(Ubuntu 5.4.0-6ubuntu1〜16.04.4)5.4.0 20160609上构建它


更新:经过一些建议,我尝试这样做:

#include <stdio.h>
int main()
{
    char buf[16];
    gets(buf);
    printf("buf @ %8p\n", (void*)&buf);
    for (int i = 0; i < 16; ++i) // this is for loop all the buf
    {
        printf("%02x ", buf[i]);
    }
    return 0;
}

它与'\ 0'一起使用

$ gcc -g j_stack.c -o j_stack
$ python -c 'print "AAAA" + "\0"*6 + "AAAA"'| ./j_stack 
buf @ 0xffffcfbc
41 41 41 41 00 00 00 00 00 00 41 41 41 41 00 ffffffff

但我怎么提供输入其中包含'\0'bufgdb节目

轨道轻度竞赛

不,不是。

此行为与gets()或Python字符串无关这是由于您使用子外壳和Bash“ herestring”语法(对您提供的内容进行了一些操作,显然包括丢弃空字节)来向程序提供输入的方式所致

# python -c 'print "\0"*11 + "AAAA"' | wc -c
16
# python -c 'print "\0"*11 + "AAAA"' | hexdump
0000000 0000 0000 0000 0000 0000 4100 4141 0a41
0000010

# cat <<< $(python -c 'print "\0"*11 + "AAAA"') | wc -c
5
# hexdump <<< $(python -c 'print "\0"*11 + "AAAA"')
0000000 4141 4141 000a
0000005

# echo $(python -c 'print "\0"*11 + "AAAA"') | wc -c
5

如果使用简单管道运行程序,则应该看到预期的结果:

python -c 'print "\0"*11 + "AAAA"' | ./myProgram

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

验证输入字段的值是否为0,然后忽略

来自分类Dev

'\ 0'!= 0是否为真?

来自分类Dev

如何忽略以0开头的整数

来自分类Dev

忽略前导0的Python编码

来自分类Dev

计算rowMean忽略0值

来自分类Dev

值是否仍为0?

来自分类Dev

是否可以创建“ 0×0”矩阵(或数组)?

来自分类Dev

0除以无限是否保证为0?

来自分类Dev

是否可以创建“ 0×0”矩阵(或数组)?

来自分类Dev

(T *)0-(T *)0`是否定义为0?

来自分类Dev

与Linq平均,同时清晰地忽略0

来自分类Dev

在NumPy中忽略除以0的警告

来自分类Dev

excel索引匹配不要忽略0

来自分类Dev

超时到期(cmd.CommandTimeout = 0被忽略)

来自分类Dev

IE11忽略底部0;

来自分类Dev

我的方法总是返回 0 忽略条件

来自分类Dev

检查整数是否以0结尾

来自分类Dev

检查整数是否以0结尾

来自分类Dev

MySQL是否将WHERE x> = 0和x <= 0优化为WHERE x = 0?

来自分类Dev

候选模板被忽略:无法将'const type-parameter-0-0 *'与'char'相匹配

来自分类Dev

开机时可忽略的错误0xc0000017和0xc0000018

来自分类Dev

html-element 属性中的换行符 (0x0a) 被 CSS 内容规则忽略

来自分类Dev

按列排序表,但如果为0,则忽略-SQLite

来自分类Dev

忽略以0-3位数字结尾的文件

来自分类Dev

忽略Puppeteer arg“ --remote-debugging-port = 0”

来自分类Dev

渐变色标在Excel中忽略0

来自分类Dev

C#,如果file.length == 0忽略

来自分类Dev

ShinobiChart忽略由0组成的系列

来自分类Dev

写入文件C时忽略\ 0字符