我正在学习使用此源代码的缓冲区溢出:
#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'
到buf
在gdb
节目
不,不是。
此行为与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] 删除。
我来说两句