最近學習了函式呼叫及返回的流程後,突發奇想能不能直接使用gdb修改棧空間,達到呼叫函式 -> 返回主函式
變為呼叫函式 -> 插入自定義函式 -> 返回主函式
的效果,感覺很有意思,遂進行以下實驗
肥腸簡單的**如下
int add2(int a, int b)
int add(int a, int b)
int main(int argc)
程式正常執行的效果如下
[root@vm_0_4_centos stackbreak]# ./main
after add
[root@vm_0_4_centos stackbreak]#
接下來進行我們的實驗,首先放上理論的修改方法
程式執行到進入add
函式時,棧的示意圖如下
rbp
和rip
兩個暫存器,若正常執行程式,rip暫存器中將儲存add函式呼叫後的位址,然後即可正常返回,我們此處改寫該位置的棧內容,將add2函式的指令位址寫入,如圖所示
rip
暫存器的指令位址改寫,如下圖所示
理論分析完畢後接下來就是實戰啦,為了程式執行的效果更佳明顯,採用attach的方式除錯
在呼叫add
函式之前打斷點
si
單步執行彙編**,檢視棧內容
add2
函式的指令位址,這樣在add
函式返回時,就會跳轉到add2
函式啦
add
函式後返回main
的指令位址
add2
執行完畢後,安全返回
呼叫函式 -> 返回主函式
變為呼叫函式 -> 插入自定義函式 -> 返回主函式
的效果。
通過本次學習,感覺對自己的程式真是可以為所欲為 -> 為所欲為 -> 為所欲為
GDB改變程式的執行
1 修改變數值 set var var name num 最佳 print var name num 2 跳轉執行 gdb提供了亂序執行的功能。jump linespec linespec可以是檔案的行號,也可以是 num這偏移的形式。jump addr jump不會改變當前程式棧中的內容,所以,當...
gdb除錯多流程程式
預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb v7.0 支援多程序的分別以及同時除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow fork mode 預設值 parent 和detach on fork 預設值 on 即可。設定方法 set follow fork...
gdb除錯當前執行的程式
為什麼使用gdb除錯正在執行的程式?因為有時候bug很難復現 或者環境搭建起來比較困難,所以在出現bug的時候可以使用gdb的attach功能除錯正在執行的gcc編譯出來的程式,注意編譯選項要加 g,否則沒有符號表。除錯步驟?1.編譯時候帶 g選項。2.執行程式。3.ps找到程序號。4.啟動gdb,...