给出c代码
void foo()
{
inta,*p;
p=(int*)((int)&a+8);
*p+=12;
}
int main()
{
foo();
printf("Print1\n");
printf("Print2\n");
printf("Print3\n");
printf("Print4\n");
return0;
}
代码的意图就是通过调用foo函数,使得不输出Print1只输出Print2 Print3 Print4
也就是通过调用foo函数将函数的返回地址修改为printf("Print2\n")这条指令的地址处
在linux系统上,通过gcc foo.c m.c
得到的是可执行文件a.out
通过对可执行文件a.out进行反汇编
objdump -d a.out
如图所示
观察foo函数的反汇编代码
通过观察反汇编的main函数部分
我们知道,指针p是处于栈指针 esp-8的位置的
而栈指针esp+4的位置是foo函数的返回地址
所以指针p需要加上12才能回到foo的返回地址上去
我们为了不输出Print1
要使返回地址加上12
也就是Printf2的地址
所以输出为
这里没有输出Print1
通过修改返回地址的值,来达到调用我们想调用的指令的目的