查找堆栈的返回地址

时间:2019-04-18 14:07:30

标签: c memory

我有这个简单的代码:

#include <sys/types.h>
    #include <netinet/in.h>

    #include <stdio.h>
    #include <ctype.h>

    main(argc, argv)
        char *argv[];
    {
        char line[512];
        gets(line);

    }

我的目标是找到缓冲区末端与堆栈的返回地址之间的距离。

因此,如果我的缓冲区(行)是512字节,我可以找到起始地址,然后添加512并知道该距离的起始位置在哪里..但是我将如何找到堆栈的返回地址?

基本上,我只是想弄清楚如何找到堆栈的返回地址和缓冲区的起始地址。在拆卸main时找不到它

1 个答案:

答案 0 :(得分:1)

#include <stdio.h>

int main()
{
    long l, k;

    asm("mov %%rsp,%0" : "=r"(l));
    asm("mov %%rbp,%0" : "=r"(k));
    printf("Stack pointer: 0x%16.16lX\n", l);
    printf("Stack frame base: 0x0%16.16lX\n", k);
    printf("Distance to return address: %ld\n", k-l);
}
snow ~ $ ./test
Stack pointer: 0x00007FFC95B793C0
Stack frame base: 0x000007FFC95B793D0
Distance to return address: 16

显然这不是可移植的,我在这里假设x64和gcc。

注意:BP并不总是指向返回地址。有时,它不用作堆栈框架指针,并且某些函数可能不会在堆栈上返回其值。寄存器优化会破坏它。局部变量可能会破坏它。可变的单词对齐方式可能会破坏它。基本上,不要指望它能起作用。 (我相信,根据编译器/编译时选项,您可能还需要为此添加一个常量偏移量。)

我真的很想知道是否有更好的方法来做您想做的事情……=)