Hello!
寫程式前一樣來一首歌吧,這首是落日飛車的My Jinji,第一次聽到的時候以為是外國的樂團,沒想到是台灣本土的樂團,輕快浪漫的曲調可以讓人放鬆心情,很適合拿來配著寫程式。
題目在這裡,是一題heap題
基本資料
[*] '/home/tommy/ctfs/pwnable.tw/hacknote/hacknote'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x8048000)
環境建置
在這裡還希望可以有人可以多多給我意見QQ
目前我的作法是利用這個工具,利用offset來找出相對應的libc版本,然後根據版本使用相對應版本的ubuntu docker image(因為pwnable.tw已經有說是使用ubuntu了)
在執行的時候,不知道為什麼
$LD_PRELOAD=./題目給的libc.so.6 ./hacknote
會直接crash掉,有高手說是因為沒有相對應的dynamic linker,這部分還需要多多研究了。總之目前是
$objdump -T ./libc_32.so.6 | grep setvbuf
0005f800 g DF .text 000001c6 GLIBC_2.0 _IO_setvbuf
0005f800 w DF .text 000001c6 GLIBC_2.0 setvbuf
$~/libc-database/find setvbuf 5f800
ubuntu-xenial-amd64-libc6-i386 (id libc6-i386_2.23-0ubuntu10_amd64)
接著google一下,就可以知道是ubuntu第幾版所使用的libc.so.6了,然後就可以使用相對應的docker image。
另外一個疑問是,/lib/i386-linux-gnu/libc.so.6跟/lib32/libc.so.6是不同的檔案?裡面的偏移不同。
我的系統預設是使用/lib/i386-linux-gnu/libc.so.6
但是/lib32/libc.so.6才跟題目給的檔案相同,所以最後需要
$LD_LIBRARY_PATH=/lib32 ./hacknote
才能跟題目一模一樣地正常執行。
基本功能
有add_note,delete_note, 以及print_note(雖然把符號拔掉了,但是用ghidra很快就能看出來)
add_note:每次呼叫add_note的時候,會先malloc一塊0x8bytes大小的塊,裡面前4bytes放著0x804862b,後4bytes指向輸入的內容,內容的大小不限。
delete_note:每次呼叫delete的時候,會先free掉固定0x8的那一塊,再free掉我們指定大小的那一塊。
print_note:會呼叫0x8那一塊前4bytes所指向的函式,並且以後4bytes當作參數。沒特別做事的話,前4bytes指向的函式就是0x804862b,後4bytes指向我們指定大小與內容的塊。
FUN_0x804862b:把參數當作char*,並列印出內容。
想法
因為一次會malloc出兩塊,所以假如自己指定的那一塊大小也設定成0x8的話,就可以很自然的double free了。
並且free掉後指針沒有清空,所以在delete後還是能進行print_note,於是能造成UAF(use after free)。
利用方式
利用double free控制固定大小為0x8的那一塊,再利用UAF來leak出libc base以及system()拿shell。