終於要準備開始逆向了,首先先用C語言寫兩個小程式
在兩個系統中的HelloWorld的C語言程式
簡單來說就是Helloworld字串會跑6次之後結束。
把它送到IDA Pro和GDB中,GDB可能顯示的會是AT&T,如果不習慣可以跟我一樣換成Intel的顯示方式GDB 設定set disassembly-flavor intel。
在編譯時會關閉一些保護機制,例如Stack canary、NX、PIE,方便我們觀察還有後續做簡單的Stack buffer overflow,可以利用checksec這個工具去確認執行檔的保護機制狀態(在GCC中可下-fno-stack-protector -no-pie -zexecstack指令來關閉),要注意的是,Windows預設情況下是不能關閉NX的,這邊在Windows當中不會關閉,後續做Return to stack shell code時會以Ubuntu為主 。
很明顯的發現IDA是比較好閱讀的,在這一章我們會大概敘述程式流程,但在接下來的章節會更詳細的敘述整體程式碼。
我們逐行來看,IDA會先顯示需要用到的資訊,Str是bytes格式放在-10hex的地方,依此類推。
而Ubuntu會先做End Branch 64 bit,這是一種intel的保護機制,防止一些利用間接分支的攻擊,例如 ROP等。
接下來會拉出Stack所需要的空間,也就是
push rbp
mov rbp, rsp
sub rsp,xxx
這個部分會再下一章詳細說明,接下來是將一串Hex放入RAX內,而這一串是ASCII Code的Hex,再來將RAX放入Stack的RBP+Str的位置,也就是RBP-0x10的地方,接下去也是mov一串ASCII Code到Stack內,由於字串太長,所以這邊會分兩次放入。
接下去的Jmp在IDA中是有圖形化箭頭指向,而在GDB內是寫跳到main+58的位址,接下去就會做cmp也就是比較,如果符合小於等於5就會轉跳到IDA的綠色箭頭;GDB的main+42位址,如果不符合IDA指向紅色箭頭做結束,GDB接著往下跑,最後將Stack的空間釋放後程式結束。
這邊先讓各位大概有一個Reverse的感覺。