更多精彩內容,請關注微信公眾號:后端技術小屋
最近在一個技術分享上聽說了一個有意思的gdb插件:peta(https://github.com/longld/peda),使用它可方便地對C/C++代碼進行逆向工程

peda的輸出分為三個框,一個顯示暫存器狀態,一個顯示當前匯編指令,一個顯示stack狀態
安裝方法很簡單,
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一探究竟
gdb ./a.out

核心代碼如下,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腳本攻略讀書筆記
更多精彩內容,請掃碼關注微信公眾號:后端技術小屋,如果覺得文章對你有幫助的話,請多多分享、轉發、在看,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/267275.html
標籤:C++

