gdb中的缓冲区长度不同

时间:2015-10-29 06:51:41

标签: c gdb buffer overflow

我正在尝试使用以下程序:

#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,但仍然太远了)

0 个答案:

没有答案