給出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
通過修改返回地址的值,來達到調用我們想調用的指令的目的