infant-gotoheaven
Challenge Link: infant-gotoheaven
Category: pwn
Writeup: infant-gotoheaven
What's the token to heaven?
nc bamboofox.cs.nctu.edu.tw 58796
Go binanry 小訣竅
開始前先講一下分析 Go 的 binanry 時可以用到的一些工具以及訣竅
go tool objdump
go tool是 go 的編譯器內建的工具集,其中也有 objdump可以使用
使用這個工具的話可以看到 source code 中的行數對應到的 assembly
go tool objdump infant-gotoheaven | less

gdb
使用gdb追蹤時,在執行到main之前會經過一大堆的程序
在追蹤 C 的 binanry 時,通常會使用 b main來設斷點在main 的一開始
由上面 go tool objdump的圖可以看到,Go 的 main 叫做 main.main 所以要使用
b main.main
觀察
這支程式可以讓使用者輸入一串字串
% ./infant-gotoheaven
Give me your text :
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Buffer overflow
通常看到這類題目大概都是 buffer overflow ,所以先試一下能不能觸發 segmentation fault
% ./infant-gotoheaven
Give me your text :
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
unexpected fault address 0x0
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x4a263e]
goroutine 1 [running]:
runtime.throw(0x4d8780, 0x5)
/usr/local/go/src/runtime/panic.go:605 +0x95 fp=0xc420043f28 sp=0xc420043f08 pc=0x427a05
runtime.sigpanic()
/usr/local/go/src/runtime/signal_unix.go:374 +0x227 fp=0xc420043f78 sp=0xc420043f28 pc=0x43d037
main.main()
/home/frozenkp/Downloads/gobin/infant-gotoheaven/infant-gotoheaven.go:27 +0x1ee fp=0xc420043f80 sp=0xc420043f78 pc=0x4a263e
最後一行有寫到死在infant-gotoheaven.go:27
用objdump看一下發現是死在ret,所以應該是可以蓋到 return address

weird
接著在翻一下objdump的結果,發現一個叫 weird的 function

其中有一行CALL os/exec.Command(SB)可以執行 system call
檢查一下其他地方的程式碼,發現main.main有呼叫到

使用gdb強制讓cmp符合後跳過去後發現這個 system call 的參數是 /bin/sh

所以只要進入到weird應該就能拿到 shell 了
解法
payload
先隨便輸入來造成 segmenataion fault,確定程式會產生 buffer overflow,且是死在 return addresss 錯誤

計算一下 payload 是 224
weird
因為可以蓋到 return address,也就是說可以任意指定要跳到哪裡,那就把 return address 改成weird的開頭0x4a2650就可以跳過去執行囉
執行後果然就成功拿到 shell 了 OwO