c - 查找堆栈的返回地址

标签 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 时找不到它

最佳答案

#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 并不总是指向返回地址。有时它不用作堆栈帧指针,并且某些函数可能不会在堆栈上返回其值。寄存器优化会打破它。局部变量可能会破坏它。可变的字对齐可能会破坏它。基本上,不要指望它起作用。 (我相信根据编译器/编译时选项,您可能还需要为此添加一个常量偏移量。)

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

关于c - 查找堆栈的返回地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55747800/

相关文章:

c - 这段代码定义是否明确(Casting HANDLE)

c++ - 使用 C++ 释放内存

c++ - 定义 "library-safe"代码的概念

c - C 中的 string_comparator

java - Android:释放引用后内存未释放

c++ - 内存与无理数与 float

c++ - 释放内存的重要性?

c - 判断指针是否映射到当前进程

c - gcc中的 '-Wextra'和 '-pedantic'有什么区别?

c - 使用 [] 运算符访问动态数组