分享一個有意思的gdb插件

更多精彩內容,請關注微信公衆號:後端技術小屋ios

最近在一個技術分享上據說了一個有意思的gdb插件:peta(https://github.com/longld/peda),使用它可方便地對C/C++代碼進行逆向工程git

效果圖
peda的輸出分爲三個框,一個顯示寄存器狀態,一個顯示當前彙編指令,一個顯示stack狀態github

安裝方法很簡單,redis

git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
echo "DONE! debug your program with gdb and enjoy"

接下來寫個小程序試用下:小程序

#include <iostream>

int main() 
{
	int i = 10;
	i = i++;
	std::cout << i << std::endl;
	return 0;
}

執行i = i++以後,i的值是多少呢?是10仍是11?根據語言標準這實際上是未定義行爲,也就是返回什麼值,主要取決於具體的編譯器實現。接下來咱們在X86 GCC編譯看看結果如何?後端

g++ -g -O0 1.cpp
./a.out
10

能夠看到i的結果爲10。爲何會這樣呢?咱們逆向二進制a.out一探究竟bash

gdb ./a.out

peda截圖

核心代碼以下,i從內存load到寄存器以後,先執行自增,而後先將自增結果11 save到內存,再將i++返回值10 save到內存,結果值11被10覆蓋,最終i的值爲10。微信

0x00000000004007ea <+8>:	  mov    DWORD PTR [rbp-0x4],0xa   ; i = 10
   0x00000000004007f1 <+15>:	mov    eax,DWORD PTR [rbp-0x4]   ; eax = i(10)
=> 0x00000000004007f4 <+18>:	lea    edx,[rax+0x1]             ; edx = 11
   0x00000000004007f7 <+21>:	mov    DWORD PTR [rbp-0x4],edx   ; i = edx(11)
   0x00000000004007fa <+24>:	mov    DWORD PTR [rbp-0x4],eax   ; i = eax(10)

推薦閱讀
推薦閱讀分佈式

  • 一文讀懂clickhouse集羣監控
  • 30分鐘入門Vim
  • 30分鐘入門GDB
  • STL源碼分析--vector
  • zookeeper client原理總結
  • redis實現分佈式鎖
  • 推薦幾個好用的效率神器
  • C/C++關鍵字之restrict
  • 現代C++之右值語義
  • Python亂碼九問
  • Linux Shell腳本攻略讀書筆記

更多精彩內容,請掃碼關注微信公衆號:後端技術小屋。若是以爲文章對你有幫助的話,請多多分享、轉發、在看。
二維碼ide

相關文章
相關標籤/搜索