GDB除錯之改變程式執行流程

2021-10-08 23:03:55 字數 1759 閱讀 4514

最近學習了函式呼叫及返回的流程後,突發奇想能不能直接使用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函式時,棧的示意圖如下

rbprip兩個暫存器,若正常執行程式,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,...