深入理解黑客攻擊-改變程序的返回地址

給出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

通過修改返回地址的值,來達到調用我們想調用的指令的目的


發佈了54 篇原創文章 · 獲贊 15 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章