Info
Category: pwn Point: 100 Solver: Naetw @ BambooFox
Analyzing
32 bit ELF, Partial RELRO, 有 canary & NX, 沒有 PIE
程式小小的,比較少見的部分是 alloca
的部分,不同於平常的 malloc
,alloca
是從 caller 的 stack frame 上分配記憶體,在 function call 結束時,回收記憶體。
main:
因為 alloca
,main 裡有一行指令是 sub esp, eax
,這個 eax 的值會是根據輸入的 message length 並做一些處理,所以想法是讓 eax 為負數,sub esp, eax
指令做完後,esp 的 address 高於 ebp,這樣在 call message 時,因為 message function 的 stack frame 跟 main 的 stack frame 重疊,就可以用 overflow 來 overwrite return address。
來看一下 stack frame 的變化:
+------------------+ low address
origin |..................| <- esp
|..................|
|..................|
|..................|
|..................|
|..................|
|......previous ebp| <- ebp
|....return address|
+------------------+ high address
after sub esp, eax
:
+------------------+ low address
new |..................|
|..................|
|..................|
|..................|
|..................|
|..................|
|......previous ebp| <- ebp
|....return address|
|..................|
|..................|
|..................|
|..................|
|..................| <- esp
+------------------+ high address
message:
雖然因為輸入的 length 是負數,第一個 getnline
無法輸入,但是主要利用的是 stack frame 的重疊,所以要寫入的地方就著重在 local variable v3
上
Exploit
找到漏洞後,我們已經能利用 overwrite ret address 來控制 eip,不過我們還差 libc information
因此第一步是 leak libc function address,計算 v3
的位置與 main ret address 的 offset,因為是 32 bits,我們疊一下 fake function call,利用 printf
來 leak info 後,return 回 main
之後再做一次差不多的事,只是這次的 fake function call 是 call system('sh')