我正在尝试使用以下程序:
#include <string.h>
int main(int argc, char *argv[]) {
char little_array[512];
if (argc > 1)
strcpy(little_array, argv[1]);
}
我想首先找到缓冲区长度以便溢出堆栈,所以我使用
(gdb) x/20xw $esp-532
0xffffcda8: 0x00000001 0x00000000 0x41414141 0x41414141
0xffffcdb8: 0x41414141 0x41414141 0x41414141 0x41414141
0xffffcdc8: 0x00000041 0xf7fe6b8c 0xf7ffd000 0x00000000
0xffffcdd8: 0xffffce98 0xf7fe70db 0xf7ffdaf0 0xf7fd8e08
0xffffcde8: 0x00000001 0x00000001 0x00000000 0xf7ff55ac
(gdb)
我找到了地址(因为我跑了'AAAA'),所以地址是0xffffcdaa。 运行64位系统,禁用ASLR。 我将缓冲区定义为512字节长。
我得到了
(gdb) p 0xffffddf0 - 0xffffcdaa
$1 = 4166
(gdb)
这怎么可能?它与我的64位系统有关吗?我试图跟随一本旧书,不能找到更好的东西。
我用这个程序找到了起点
// find_start.c
unsigned long find_start(void)
{
__asm__("movl %esp, %eax");
}
int main()
{
printf("0x%x\n",find_start());
}
(当这个程序使用-m32标志编译时,它的输出给了我一个起点,给我一个更好的结果,574,但仍然太远了)