我有这个简单的代码:
#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时找不到它
答案 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并不总是指向返回地址。有时,它不用作堆栈框架指针,并且某些函数可能不会在堆栈上返回其值。寄存器优化会破坏它。局部变量可能会破坏它。可变的单词对齐方式可能会破坏它。基本上,不要指望它能起作用。 (我相信,根据编译器/编译时选项,您可能还需要为此添加一个常量偏移量。)
我真的很想知道是否有更好的方法来做您想做的事情……=)