2019 AIS3 Pre Exam - Writeup
題目:Random Guess
, RSA101
, RSA202
, TCash
, Are You Admin?
, Crystal Maze
, KcufsJ
, Welcome
, Welcome BOF
, Holy Grenada
, Trivial
, TsaiBro
, d1v1n6
, Hidden
, SimpleWindow
Crypto - Random Guess
Challenge Info
沒記錄到
Solution
題目大概長這樣:
|
|
解題腳本:
|
|
Flag
AIS3{GGEZ!!LiNe42_COngRuen7i4l_6eNErATor}
Crypto - RSA101
Challenge Info
110001001100001011000100111100100100000011100100111001101100001
nc pre-exam-chals.ais3.org 10201
Observation
題目那一串二進位字串轉十六進位再轉字串之後是baby rsa
題目的形式如下:
|
|
會給我們public key
跟Encrypted Flag
,每次都不一樣,接下來可以不斷輸入n
,會回傳(n % phi) % 64
的結果
目標很明確,要讓我們找出phi
然後解碼Encrypted Flag
有嘗試過去 factordb 找答案,或是用 yafu 暴力解,因為 N
有點長,短時間解不出來就放棄這樣做了。
Step 1
觀察 (n % phi) % 64
,可以發現 phi
遠大於 64
,因此假設 n
是 64
的倍數:
CASE1: 如果 n
小於 phi
,顯然地 (n % phi) % 64 = 0
CASE2: 如果 n
比 phi
大一些,此時 (n % phi) != 0
,所以 (n % phi) % 64 != 0
因此可以不斷遞增64的倍數,直到回傳值不為0,藉此找到 phi
的上界。
|
|
Step 2
我以每次乘10的方式逼近上界(也就是n = 64, 640, 6400, ...
)
因此若上界為64 * b
,我取下界a = 64*b/10
,有上下界就可以用Binary Search快速逼近phi
。
舉例來說,如果測量到的上界為6400 = 64 * 100
,下界可以設為640 = 64 * 10
,Binary Search時就取64 * ((100+10)/2) = 64 * 55 = 3520
,如果回傳值為0
,更新下界,否則更新上界。
|
|
Step 3
Binary Search 之後還沒得到答案,因為真正的phi
是64*a+1 ~ 64*b
其中一個。
索性把所有數字都當作phi
計算出對應的Plaintext
然後存起來,因為我轉十六進位再轉字串的方法會報錯(可能是長度不符吧,懶得處理,決定再跑一次Step1 ~ Step2
,將兩個Plaintext
的集合取交集之後就可以得到真正的Plaintext
。
最後把它轉十六進位再轉字串就能得到flag
程式碼如下:
|
|
Flag
AIS3{RSA_L0L_01100110011101010110001101101011}
可以試著將flag中的二進位轉成字串看看www
Crypto - RSA202
Challenge Info
沒備份到
Solution
題目大概長這樣:
|
|
已知數有:e
, n1
, n2
, enc1
, enc2
首先觀察它們的長度:
e
挺正常的長度n1
約為180位數n2
約為720位數
n1
的長度有點短,因此用yafu做質因數分解,成功分解得到r
, next_prime(r)
:
|
|
{< admonition warning >} Latex 渲染問題我有空再解決 {< /admonition >}
再來處理n2
,看到大位數首先丟到factorDB中,抽中就結束了。
看來並沒有那麼好的事情,只好面對題目給的關係式($%$為模運算):
$$ ((p-1)%r)^2+((r^5-1)%p)^2=0 $$
首先因為餘數必定大於等於0
,所以有:
$$ (p-1)\equiv0\pmod{r} $$ $$ (r^5-1)\equiv0\pmod{p} $$
1$^o$ 考慮式1: 可以知道$\ p>r$
2$^o$ 考慮式2: $$ (r-1)(r^4+r^3+r^2+r^1+1)=(r^5-1)\equiv0\pmod{p} $$ $$ \Rightarrow(r-1)\equiv0\pmod{p}\lor(r^4+r^3+r^2+r^1+1)\equiv0\pmod{p} $$
根據1$^o$,$(r-1)\equiv0\pmod{p}\ $不成立,因此$(r^4+r^3+r^2+r^1+1)\equiv0\pmod{p}\ $必然成立
不妨假設$\ (r^4+r^3+r^2+r^1+1)={k}\times{p}$
計算$R=r^4+r^3+r^2+r^1+1$,為一個362位數。把它拿去做質因數分解,發現是個質數。
也就是說$\ k=1\ $且$\ p=R\ $。
得到$\ p\ $,所以$\ q=n_2/p\ $,需要的數字都得到了。
接下來是開心的RSA解碼時間:
|
|
把enc1
, enc2
解碼之後合併就得到flag了
Flag
AIS3{S0me7im3s_I_h4tE_factorDB}
把兩百多組n2丟到factordb都沒中QQ
Crypto - TCash
Challenge Info
T? Cat? Hash?
1 2 3 4 5 6 7 8 9 10 11 12 13
from hashlib import md5,sha256 from secret import FLAG cand = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890@,- _{}' md5s = [] sha256s = [] for f in FLAG : assert f in cand md5s.append( int(md5(f.encode()).hexdigest(),16)%64 ) sha256s.append( int(sha256(f.encode()).hexdigest(),16)%64 ) # md5s = [41, 63, 46, 51, 6, 26, 42, 50, 44, 33, 29, 50, 27, 28, 30, 17, 31, 19, 46, 50, 33, 45, 26, 26, 29, 31, 52, 33, 1, 45, 31, 22, 50, 50, 50, 50, 50, 31, 22, 50, 44, 26, 44, 49, 50, 49, 26, 45, 31, 30, 22, 44, 30, 31, 17, 50, 50, 50, 31, 43, 52, 50, 53, 31, 30, 17, 26, 31, 46, 41, 44, 26, 31, 52, 50, 30, 31, 26, 39, 31, 46, 33, 27, 1, 42, 50, 31, 30, 12, 26, 27, 52, 31, 30, 12, 31, 46, 26, 27, 14, 50, 31, 22, 52, 33, 31, 41, 50, 46, 31, 22, 23, 41, 31, 53, 26, 21, 31, 33, 30, 31, 19, 39, 51, 33, 30, 39, 51, 12, 58, 60, 31, 41, 33, 53, 31, 3, 17, 50, 31, 51, 26, 29, 52, 31, 33, 22, 26, 31, 41, 51, 54, 41, 29, 52, 31, 19, 23, 33, 30, 44, 26, 27, 38, 8, 50, 29, 15] # sha256s = [61, 44, 3, 14, 22, 41, 43, 30, 49, 59, 58, 30, 11, 3, 24, 35, 40, 46, 3, 42, 59, 36, 41, 41, 41, 40, 9, 59, 23, 36, 40, 33, 42, 42, 42, 42, 42, 40, 44, 42, 49, 24, 49, 28, 42, 33, 24, 36, 40, 24, 33, 10, 24, 40, 35, 42, 42, 42, 40, 39, 9, 42, 3, 40, 24, 35, 24, 40, 3, 61, 49, 24, 40, 9, 42, 24, 40, 41, 17, 40, 12, 57, 11, 23, 43, 42, 40, 24, 18, 41, 11, 9, 40, 24, 18, 40, 3, 41, 11, 12, 42, 40, 44, 9, 59, 40, 61, 42, 3, 40, 44, 13, 61, 40, 3, 24, 29, 40, 59, 24, 40, 19, 18, 6, 59, 24, 18, 6, 22, 0, 39, 40, 61, 57, 3, 40, 17, 35, 42, 40, 58, 24, 58, 9, 40, 59, 44, 24, 40, 61, 48, 52, 61, 58, 9, 40, 19, 13, 59, 24, 53, 41, 11, 55, 55, 42, 58, 18]
Solution
暴力破解就能逆推回flag
|
|
Flag
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 AlWAys TCat2019Key}
Misc - Are You Admin?
Challenge Info
nc pre-exam-chals.ais3.org 10203
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
#!/usr/bin/ruby require 'json' STDOUT.sync = true puts "Your name:" name = STDIN.gets.chomp puts "Your age:" age = STDIN.gets.chomp if age.match(/[[:alpha:]]/) puts "No!No!No!" exit end string = "{\"name\":\"#{name}\",\"is_admin\":\"no\", \"age\":\"#{age}\"}" res = JSON.parse(string) puts res if res['is_admin'] == "yes" puts "AIS3{xxxxxxxxxxxx}" # flag is here else puts "Hello, " + res['name'] puts "You are not admin :(" end
Solution
觀察
|
|
跟
|
|
兩部分可以知道要讓想辦法讓res["is_admin"]
變成"yes"
。
有點sql injection的感覺(?
name
輸入YABASU", "is_admin":"yes", "A": { "B":"C
age
輸入1", "2": "3"}, "4": "5
這樣string
就會變成
|
|
轉成JSON
格式之後:
|
|
目標達成,得到flag
如果不使用
{
,}
把"is_admin": "no"
處理掉,它會覆蓋前面的"is_admin": "yes"
Flag
AIS3{RuBy_js0n_i5_s0_w3ird_0_o}
Misc - Crystal Maze
Challenge Info
nc pre-exam-chals.ais3.org 10202
Solution
是個走迷宮小遊戲,連線之後會看到以下訊息:
|
|
輸入想要前進的方向,如果撞到牆壁會回傳wall
,否則是ok
,重複輸入直到找到終點。
另外這題有時間限制,大概2~3秒左右就會自動斷線。
使用pwntools
幫忙輸入,再用DFS
遍歷迷宮,成功找到flag,程式碼如下:
|
|
{< admonition note >}
為求方便,上方程式碼沒有處理迴圈情況。
若要更完備,需要為走過的座標(採用二維陣列紀錄相對座標)塗顏色(白、灰跟黑),走到灰色點即表示找到back edge
也就是出現迴圈。
{< / admonition >}
Flag
AIS3{4R3_Y0U_RUNN1NG_45_F45T_45_CRY5T4L?}
Misc - KcufsJ
Challenge Info
Javascript ?!
Solution
給了明顯是JSFuck
的字串,根據題目提示,把字串反轉。
反轉後拿去瀏覽器alert()
即可得到flag
Flag
AIS3{R33v33rs33_JSFUCKKKKKK}
Misc - Pysh
Challenge Info
nc pre-exam-chals.ais3.org 10204
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# main.py #!/usr/bin/python import os import sys black_list = "bcfghijkmnoqstuvwxz!@#|[]{}\"'&*()?01234569" your_input = raw_input(":") for i in range(len(black_list)): if black_list[i] in your_input: print "Bad hacker...." exit() print os.system("bash -c '" + your_input + "'")
Solution
首先到自己的機器上找有哪些指令可以用ls /usr/bin/ | grep -v "[bcfghijkmnoqstuvwxz01234569]"
[
aplay
ar
GET
HEAD
ld
ldapadd
ldd
lp
lpr
paplay
pear
perl
player
player.py
pldd
POST
pr
X
yelp
本來以為可以用 perl
取得 shell,總之是失敗了。
其實打$SHELL
就可以了…
因為$SHELL
會存shell的路徑,可能是/bin/bash
之類的,所以bash -c '$SHELL'
就是bash -c '/bin/bash'
,直接得到shell。
之後ls
發現有個檔案flag-a008b609dd552dca425779a8e1882485
cat flag-a008b609dd552dca425779a8e1882485
就能得到flag
Flag
AIS3{read;$REPLY}
Misc - Welcome
Challenge Info
AIS3{echo -n ‘Welcom to AIS3 pre-exam in 2019!’ | md5sum}
Ps. md5 hash only
Solution
執行echo -n 'Welcom to AIS3 pre-exam in 2019!' | md5sum
得到988069d2c08c1910f422737ca412afe2
Flag
AIS3{988069d2c08c1910f422737ca412afe2}
Pwn - Welcome BOF
Challenge Info
沒記錄到
Solution
好像是最基本的 BOF,要記得對齊
Flag
AIS3{TOO0O0O0O0OO0O0OOo0o0o0o00_EASY}
Reverse - HolyGrenade
Challenge Info
// output.txt ba3a7f3bd92a5d418f5e16886db62674 33e4500b205b80e52dd52e796cba8b7d 7d1c09bbf2025facf6bd0fec0ec6a780 9cedd8dee7b5b87838d7a9bed76df8e5 764d30cb4807c5a870a47b53be6cf662 f1e8fda6c3ff87e43905ea1690624c64 d7939cb11edaa9b1fb05efb4e2946f75 5ae001ebd955475c867617bdb72e7728
Solution
把題目提供的HolyGrenade.pyc
拿去decompile,得到:
|
|
簡單來說它會把flag
編碼成output.txt
那樣,每一列都是由四個字元組成的,像ouptut.txt
的第一列代表AIS3
。
決定直接爆破:
|
|
吃個飯回來就得到flag了
Flag
AIS3{7here_15_the_k1ll3r_ra661t}
Reverse - Trivial
Challenge Info
It’s trivial, but the speed would affect your ranking
Solution
strings Trivial | grep "AIS3"
發現有東西。
strings Trivial
找到許多明顯是flag的東西:
|
|
湊一湊就有flag了
Flag
AIS3{This_is_a_reallllllllllly_boariiing_challenge}
Reverse - TsaiBro
Challenge Info
觀…自在…菩薩…行…深…般若… 波羅…密…多…時…照見…五蘊皆空.
1 2 3
// flag.txt Terry...逆逆...沒有...學問...單純...分享...個人...生活...感觸... 發財....發財...發財.....發財...發財......發財.....發財.......發財.......發財........發財......發財....發財.發財.......發財....發財...發財.....發財........發財........發財.......發財........發財...發財..發財.發財.....發財........發財........發財.發財.發財........發財........發財.發財..發財.......發財.....發財.發財.......發財........發財........發財.發財......發財.......發財........發財..發財......發財........發財........發財.......發財....發財.發財......發財........發財........發財...發財....發財...發財...發財.發財.發財..發財.發財.發財..發財...發財..發財..發財.......發財........發財........發財..發財......發財.......發財....發財...發財.......發財........發財.......
Solution
strings TsaiBro
能發現一組字串abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY0123456789{}_
先存下來
執行後發現要加參數,稍微試一下不難發現規律:
|
|
把flag.txt
拿來解碼就能得到flag
Flag
AIS3{y0u_4re_a_b1g_f4n_0f_tsaibro_n0w}
並沒有
Web - d1v1n6
Challenge Info
GOGOGO
Solution
有個hint
連結http://pre-exam-web.ais3.org:10103/?path=hint.txt
,裡面只有發財
兩個字
應該是LFI
漏洞,使用PHP偽協議把index.php
dump出來:
|
|
得到一個base64 encode過的字串:
|
|
decode 之後得到原始碼:
|
|
看來用127.0.0.1
連上去可以得到flag的提示,一樣用php偽協議把提示拿出來:
|
|
不知道為什麼127.0.0.1不給過,127.0.0.2倒是可以
一樣得到Base64編碼的字串:
RkxBR18xNGQ2NTE4OTY2OWYwNWQyMDY3NjRjOWRlNDQxNDc0ZC50eHQ=
解碼之後得到提示:
FLAG_14d65189669f05d206764c9de441474d.txt
接下來的目標是取得FLAG_14d65189669f05d206764c9de441474d.txt
的內容,有兩層關卡:
第一關
|
|
首先path
內容中的所有flag
字串都會被替換成''
,只要把路經中的FLAG
換成FFLAGLAG
就可以了。
第二關
|
|
經過第一關之後,有flag
的字串的路徑會被擋下來,上網查之後知道php偽協議可以繞過它。
所以Payload如下:
|
|
依然得到Base64編碼的字串:
|
|
解碼之後得到flag跟d1v1n6 d33p3r
的提示:
|
|
Flag
AIS3{600d_j0b_bu7_7h15_15_n07_7h3_3nd}
Web - Hidden
Challenge Info
Solution
檢查原始碼,看到有一個main.019417bd.js
|
|
點進去發現被混淆過,看得頭很痛QQ
完全不知道它在做什麼,不過其中一段很有flag的感覺:
|
|
直接貼到console中,然後執行r()
,還真的是flag(暈
Flag
AIS3{4r3_y0u_4_fr0n73nd_g33k?}
Web - SimpleWindow
Challenge Info
這題連我阿嬷都會解
Solution
點進網址後看到一個很潮的terminal頁面,有個flag
連結可以點進去,網址是:https://simple-window.ais3.kaibro.tw:10100/flag
會看到提示Flag is here! But I catch it!
,考試時看不懂這是什麼,索性在網址後面接個參數:https://simple-window.ais3.kaibro.tw:10100/flag?a=1
就看到flag了
Flag
AIS3{D0_y0u_kn0w_Serv1ce_W0rker?}