来看这个代码
#include <stdio.h> void fun2() { printf("haha\n"); } void fun1(int a) { int* ret_addr = (&a)-1; *ret_addr = (int)fun2; } int main() { int a = 3; fun1(a); return 0; }
他跑起来之后的输出是这样的:
zrj@vm:~/tmp$ ./a.out haha 段错误 (核心已转储)
虽然触发了一个段错误,不过可以看到,还是成功的修改了函数的返回地址了的
其实之前是考虑用函数内部分配栈上变量来获得返回的地址的指针指向的,但是没有成功,可以看下这段代码
#include <stdio.h> void fun2() { printf("haha\n"); } void fun1(int a) { int b = 0; int* ret_addr = (&a)-1; printf("b+2: %p\nret_addr: %p\n", &b+2, ret_addr); *ret_addr = (int)fun2; } int main() { int a = 3; fun1(a); return 0; }
输出如下:
zrj@vm:~/tmp$ ./a.out b+2: 0xbff136c0 ret_addr: 0xbff136cc haha 段错误 (核心已转储) zrj@vm:~/tmp$ cat main.cpp
可以看到栈上变量 b 和返回地址之间还是有不小的距离的,那么这中间是什么东西呢?还没搞清楚