參加過一次AIS3(2018),今年也打算挑戰看看,去年場地是辦在台科大,而今年是在交大,所以有提供住宿,但一切的的前提都建立在我有進第二階段。
在5/25~5/27有為期三天的CTF,目的在篩選出可以參加暑期課程的學員,預計正取150人、備取30人。
這次解了10題,是去年的兩倍,自認是有點進步了,但還是很渺小QQ
官方解法
Web
Crypto
Reverse
Pwn
Pwn
Welcome BOF
簡單的bof,但是題目敘述有說 ubuntu 18.04
,所以我在本地測出來的padding長度是$48+8$但是在remote是$48$
TODO: 使用18.04去test
1 | #!/usr/bin/env python |
1 | AIS3{TOO0O0O0O0OO0O0OOo0o0o0o00_EASY} |
orw
這題只允許open
, read
和 write
這幾個syscall
1 | #!/usr/bin/env python |
1 | AIS3{B4by_sh311c0d1ng_yeeeeeeeeeeeeeeeeeee_:)} |
pwn還有看的就是hello這題,在之前學習pwn時,format string並沒有很懂,所以在賽中就邊摸編解地嘗試,但最後並沒有解出來。
- 沒解出來的
- hello
- PPAP
- Secure bof
- shellcode 2019
- Box
- Box++
Reverse
Trivial
簡單題,用disassembler打開來觀察,會發現驗證字串的function
追進去就發現被一串切成1 byte的flag
1 | AIS3{This_is_a_reallllllllllly_boariiing_challenge} |
TsaiBro
拖進disassembler看,在main()
能看到它把flag的每個字元根據它在ch[]
的位置做一些運算,然後輸出成發財...發財...
的pair
所以先對flag做一些處理(拔掉第一行,只留.
1 | .... ... |
接著就寫code試flag出來
1 |
|
1 | AIS3{y0u_4re_a_b1g_f4n_0f_tsaibro_n0w} |
HolyGrenade
這題是給一個.pyc
檔,找了一下工具uncompyle6,接著就解開.pyc
檔。
1 | $ uncompyle6 HolyGrenade.pyc |
HolyGrenade.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21from secret import flag
from hashlib import md5
def OO0o(arg):
arg = bytearray(arg, 'ascii')
for Oo0Ooo in range(0, len(arg), 4):
O0O0OO0O0O0 = arg[Oo0Ooo]
iiiii = arg[(Oo0Ooo + 1)]
ooo0OO = arg[(Oo0Ooo + 2)]
II1 = arg[(Oo0Ooo + 3)]
arg[Oo0Ooo + 2] = II1
arg[Oo0Ooo + 1] = O0O0OO0O0O0
arg[Oo0Ooo + 3] = iiiii
arg[Oo0Ooo] = ooo0OO
return arg.decode('ascii')
flag += '0' * (len(flag) % 4)
for Oo0Ooo in range(0, len(flag), 4):
print(OO0o(md5(bytes(flag[Oo0Ooo:Oo0Ooo + 4])).hexdigest()))
整理一下src:它把flag每四個一組,拿去md5,接著做一些交換,所以只要把位置換回來,再去crack md5就好。
1 | from secret import flag |
因為每個md5都是由4byte的字串hash而來,所以還可以暴力踹
1 | from hashlib import md5 |
賽後問別人的解法,他說md5拿online tool就可以解了。
1 | AIS3{7here_15_the_k1ll3r_ra661t} |
OneWay
這題題目敘述是一方通行ww
這題我賽中沒解出來,賽後問別人是說不要直接解hash,而是要用JPG檔頭去回推密文。
1 | import string |
得到輸出:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20n
i
n
i
2
2
i
d
i
d
n
o
t
i <== 這個字是錯的,根據上下文字猜測是`h`
a
v
e
p
e
t
將密文輸入至程式,得到flag1
2
3
4
5
6
7
8
9
10
11
12-----
I encrypted a image in this binary,
you have to answer my questions to decrypt it,
cuz only my friends can view this secret image
-----
Who am I? (lowercase)
nini
How old am I?
22
What the name of my first pet? (lowercase)
ididnothavepet
nini22ididnothavepet, 8932587927620123215, 20, 177593you got my secret photo
- 沒解出來的
- oneway
- MasterPiece
- Game
- BigO1
Web
d1v1n6
LFI讀出index.php
,當直接把?path=index.php
時,會發現有過濾掉flag字串,而利用php://filter
可以將字串做處理後,再輸出,bypass檢查。然而後面這部我是用假解,因為題目原本會擋掉127.0.0.1
,但是regex寫壞了,所以http://localhost
可以過。接著一樣用php:filter
讀出。
1 | $ echo RkxBR18xNGQ2NTE4OTY2OWYwNWQyMDY3NjRjOWRlNDQxNDc0ZC50eHQ= | base64 -d |
訪問FLAG_14d65189669f05d206764c9de441474d.txt
得到flag:
1 | ^`. o |
Hidden
beautify之後,直接執行其中一段js。
Misc
Are you admin
題目會輸入姓名跟年齡,接著會放進string中,給json parser解析:
string = "{\"name\":\"#{name}\",\"is_admin\":\"no\", \"age\":\"#{age}\"}"
目標:在json inject"is_admin":"yes"
,只要讓res["is_admin"] == "yes"
即可,
1 | name = ","is_admin":"yes","2":[{"1":" |
1 | AIS3{RuBy_js0n_i5_s0_w3ird_0_o} |
kcufsj
如題,jsfuck的rev,所以把內容反過來,接著evaluate即可
1 | AIS3{R33v33rs33_JSFUCKKKKKK} |
Crypto
THash
題目會把字串的每個字元拿去md5跟sha256,接著$\% 64$。把cand
的每個字都拿去hash,建成一張表,由於模除64的緣故,會有一個數字對到許多字元的情況,但只要一個字元同時出現在兩張表中,他就是flag,寫個script即可。
1 | from hashlib import md5,sha256 |
這題的flag挺有趣的www1
AIS3{0N_May_16th @Sead00g said Heeeee ReMEMBerEd tH4t heee UseD thE SAME set 0f On1iNe to01s to S01Ve Rsa AeS RCA DE5 at T-cat-cup, AnD 7he kEys aRE AlWWAys TCat2019Key}
反省
這次CTF打下來,我發現了我犯了許多錯誤:在奇怪的地方拘泥太久,像是Crystal Maze那題,我的script一直出錯,花了許多時間在debug上,但最後還是沒解出來(明明是水題orz),後來去問朋友才發現用手推就可以(再度orz,搞不好我花在debug的時間,可以去解其他題目);這代表著我的程式撰寫還是不夠,仍然沒辦法隨心應手的寫出想到的邏輯。
再來就是基礎知識不足,常常有些東西我只聽過名詞而已,但都沒花時間去理解、實作、復現,這兩點是我仍需加強的地方。
如果你覺得這篇文章很棒,請你不吝點讚 (゚∀゚)