這次的Reverse會用兩種作業系統和反編譯工具來操作,這邊先介紹GDB的基本操作,這些指令都有縮寫,比如disassemble可以寫成disas,但這邊先介紹完整指令,不過在實作部分會使用縮寫。
disassemble [function name],反編譯某個Function,也可以自訂反編譯的目標,例如main,+5是讓程式從main開頭顯示到main+5行內的程式碼,main+4,+7是讓程式從main+4顯示到main+7當中的程式碼,也可以直接輸入address來進行反編譯的顯示。
還有許多指令,例如輸入/r main,則會出現對應的OPcode等。
set disassembly-flavor [att|intel],轉換逆向出來的組合語言是AT&T或Intel。
break [address],設定程式中斷點,可以是Address也可以是Function name。
run,讓程式跑起來,如果沒有設定中斷點則會將程式執行到輸入點或會讓程式等待的點,如果都沒有,就會執行到程式結束。
start,與run的用法一樣,不同的點在於輸入後會停留在main()的第一行程式碼等待接下來的指令,其實等同於break main後下run指令。
next,不進入其他函數內,執行到下一個中斷點。
nexti,不進入其他函數內,一行一行執行。
step,跑到下一個函數內等待,可以看到main第一個call的是printf,如果在main下step就會在printf第一行等待。
stepi,逐步執行,會進入到其他函數內,在執行到printf時下stepi時會進入printf裡面。
x/s,用字串的形式查看指定的內容,指定形式的前面加入數字可以輸出接下去的內容(x為examine的意思)。
以下這些都能夠在指定形式前加入數字,來檢視接下去的內容
x/d,用十進制的形式查看指定的內容
x/x,用十六進制的形式查看指定的內容
x/f,用浮點數的形式查看指定的內容
還有t為二進制和o為八進制等各種形式表達,有興趣可以搜尋GDB x指令的其他輸出形式。
而在指定形式後方加入h表示2bytes、w表示4bytes形式輸出、g表示8bytes等。
在這次的分析當中會用到的大概有這些,當然GDB還有非常多的指令與功能,而且是在Linux系統下常用的動態逆向工具,很推薦有興趣的可以再深入研究。