【发布时间】:2017-01-02 18:49:38
【问题描述】:
我正在学习如何利用缓冲区溢出。下面是我正在玩的程序
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buffer[256];
printf("%p\n", buffer);
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
return 0;
}
我编译这个程序:gcc -fno-stack-protector -z execstack program.c -o program
我在 gdb 中加载了这个程序:gdb ./program
如果我发出以下命令:run $(python -c 'print "A" * 3000') 它会根据需要覆盖寄存器:
rbp 0x4141414141414141 0x4141414141414141
rsp 0x7fffffffd938 0x7fffffffd938
r8 0x4141414141414141 0x4141414141414141
r9 0x4141414141414141 0x4141414141414141
r10 0x4141414141414141 0x4141414141414141
..... 但是,如果我使用 IO 重定向寄存器的值向程序提供参数,则不会根据需要覆盖。
fuzz.py
#!/usr/bin/python
print 'A' * 3000
我使用fuzz.py > f将所有'A'输出到文件f
我在 gdb gdb ./program 中运行程序
现在如果我使用 IO 重定向给程序一个参数,我会得到异常输出:
run < f
我收到以下错误:
停止原因:SIGSEGV __strcpy_sse2_unaligned () 在 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296 296 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:没有这样的文件或目录。
为什么我会收到此错误 __strcpy_sse2_unaligned 而如果我使用 run $(python -c 'print "A" * 3000') 传递参数,我只会收到我想要的 SIGSEGV 错误。
信息寄存器:
rbp 0x7fffffffe4f0 0x7fffffffe4f0
rsp 0x7fffffffe3d8 0x7fffffffe3d8
r8 0x0 0x0
r9 0xf 0xf
r10 0x5d 0x5d
为什么寄存器没有被'A'覆盖?
Q1) 为什么在 gdb 中传递参数使用:
run $(python -c 'print "A" * 3000')
和
run < f
不相等? f 是包含 3000 个“A”的文件。
Q2)
这个错误是什么意思:__strcpy_sse2_unaligned ()
【问题讨论】: