Pwnable.tw dubblesort Writeup
Pwnable.tw - dubblesort
Description
Sort the memory!
Source
https://pwnable.tw/challenge/#4
0x1 Initial Reconnaissance
一個會問你名字然後 bubble sort 的小程式。
file
1 | └─$ file dubblesort |
checksec
1 | └─$ checksec ./dubblesort |
./dubblesort
1 | └─$ ./dubblesort |
0x2 patchelf
詳細可以參考 這篇教學
1 | └─$ patchelf --set-interpreter ./ld-2.23.so dubblesort |
0x2 Fuzzing & Analyze
程式很小一個,從輸入點可以看到兩個漏洞如下:
read
後沒有加null byte
,可以 leak libc_base:
- 可以 oob write,這點從 fuzzing 會觸發
stack smashing detected
可以發現它能覆蓋掉 canary:
0x3 Exploitation
攻擊思路如下:
- 先透過第一個
read
去 leak libc_base。 - 透過 oob write 想辦法蓋對 canary 或是繞過它。
- ret2libc 的
system
跟/bin/sh
- 處理 sort
- 快樂 RCE
leak libc
- 我們用 gdb 來分析 stack 上面的殘渣:方法大致如上。
1
2
3
4
5
6
7
8
9
10
11└─$ gdb -q dubblesort
gef➤ start
gef➤ break read@plt
gef➤ c
gef➤ fin
aaaa
gef➤ break __printf_chk@plt
gef➤ c
gef➤ gef config context.nb_lines_stack 30
gef➤ context stack
gef➤ vmmap
接著 demo 腳本,stack 如下,0x61616161
是我們的輸入,最後填上 ‘z’ 來幫助我們收集 leak 的資料,也就是0x7a
,後面緊接著就是 libc 裡面的某個地址:
收集 leak 出來的地址之後再vmmap
可以算出跟當前 libc_base 的差值,成功計算完,執行會長得像最上面那樣。
繞過 canary
試了一下發現想不到有什麼方式可以 leak 出 canary 又填回去,但上網查會發現 scanf
有一些特殊的性質,例如這裡 scanf
的 format specifier
是 %u
,也就是他會期待收到一個無號十進制整數,如果填 a
會直接導致後面的 scanf
都失敗,因為 stdin
一直沒有被取走,而像是 +
、-
不會讓 scanf
失敗但也不會改變陣列原本的值,我們可以利用這個來跳過 canary 的輸入。
一樣用 gdb 可以查到 canary 相對於 array[0] 的 offset,這裡輸入 5 個數字分別是 1 ~ 5,也可以用 ida 或其他逆向工具直接算:(0x7c - 0x1c) / 4 + 1 = 25
所以 canary 在 array[24],到後會填 +
或 -
。
ret2libc
1 | success('libc_base -> %s' % hex(l.address)) |
處理排序
因為最後他會把陣列內的值排序,所以我們可以先塞 24 個 1,繞過 canary,然後一路放 system
到 ret,再補四個 bytes 補齊 ret 跟 call 的差值,最後放上 '/bin/sh\0'
,canary 高機率都小於 libc 的地址,system
的 offset 也剛好比 '/bin/sh\0'
小,畫成表格可以更好理解:
array | stack | payload |
---|---|---|
a[0]~a[23] | ‘1’ | |
a[24] | canary | ‘+’ |
a[25]~a[30] | “l.sym.system” | |
a[31] | ebp | “l.sym.system” |
a[32] | ret | “l.sym.system” |
a[33] | “l.sym.system” | |
a[34] | “next(l.search(‘/bin/sh\0’))” |
環境差異
在本地成功 get shell 了:
但送到遠端會發現 libc_base 算起來不對,感覺是環境不同導致 stack 上面的殘值有所不同,但已經盡可能的透過 patchelf
去模擬一樣的環境,猜測是因為遠端是 32 位元的系統。
0x4 Exploit
上網查到正確的 offset 補上後就成功 get shell 了!
exploit.py 如下:
1 | └─$ cat exploit.py |
執行結果:
1 | └─$ python exploit.py |
Pwned !!!
- Title: Pwnable.tw dubblesort Writeup
- Author: kazma
- Created at : 2024-04-19 14:28:20
- Updated at : 2024-04-20 11:08:33
- Link: https://kazma.tw/2024/04/19/Pwnable-tw-dubblesort-Writeup/
- License: This work is licensed under CC BY-NC-SA 4.0.