Skip to content

infant-gotoheaven

Challenge Link: infant-gotoheaven

Category: pwn

Writeup: infant-gotoheaven

What's the token to heaven?

nc bamboofox.cs.nctu.edu.tw 58796

infant-gotoheaven.zip

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 錯誤

img

計算一下 payload 是 224

weird

因為可以蓋到 return address,也就是說可以任意指定要跳到哪裡,那就把 return address 改成weird的開頭0x4a2650就可以跳過去執行囉

執行後果然就成功拿到 shell 了 OwO