最近看到CIH寫的一個Hello World
看起來還滿有趣的,就拿來reverse一下
可以用線上工具 godbolt 或是本機 objdump -D -M intel <prog_name> 做靜態分析.
https://godbolt.org/z/rh9sj1oTh
整個程式一開始看起來很怪
因為 main func 沒有printf
但是最後卻能印出字串.
因為使用了 gcc extention 裡面 attribute的constructor以及naked
constructor 代表要在main func之前就執行.
Loader載入後, 會在__libc_csu_init 函數裡面跑迴圈[1]
依序執行function pointer array
就會執行到constructor function. (可用gdb設斷點在 _start 函數再run/step追蹤)
另外 deconstructor 代表要在 main func 之後就執行
naked代表編譯後的 function asm 不會有 prologue/epilogue
在asm第31行,把字串放到edi暫存器
因為最後printf的參數要用到.
再來把程式餵給 peda-gdb 動態分析
一路next追蹤下去會發現,執行到x3結束時
function 的 return
其實是會把stack上面的資料取出來放到暫存器(有人說是RIP,或是RCX等free registor)
然後再去jmp它.(補充:leave就是prologue前兩行的逆操作)
因為這時stack頂端是 address of printf
因此程式流程會在x3結束時去執行printf
最後就會看到字串 "CIH: Hello Hacker"
Ref:
[1] Linux x86 Program Start Up