C 查找堆栈的返回地址

C 查找堆栈的返回地址,c,memory,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); } #包括 #包括 #包括 #包括

我有一个简单的代码:

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

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

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

    }
#包括
#包括
#包括
#包括
主(argc、argv)
char*argv[];
{
字符行[512];
获取(行);
}
我的目标是找到缓冲区末端和堆栈返回地址之间的距离

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

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

#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);
}
显然这是不可移植的,我在这里假设x64和gcc

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


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

您需要使用内联汇编来可靠地获取堆栈基指针。(特别是,它不是每个程序/函数/执行点的固定值)。(另外:并非所有返回值都在堆栈上返回!我不想再问您为什么要这样做了。:)您必须分析编译器/平台的调用方法。然后你可以把它应用到你的问题上。可能是重复的@PaulOgilvie我该怎么做?真的不知道从哪里开始
snow ~ $ ./test
Stack pointer: 0x00007FFC95B793C0
Stack frame base: 0x000007FFC95B793D0
Distance to return address: 16