この大会は2021/6/5 13:00(JST)~2021/6/7 13:00(JST)に開催されました。
今回もチームで参戦。結果は660点で234チーム中6位でした。
自分で解けた問題をWriteupとして書いておきます。
Simple Discord (Miscellaneous 5)
Discordに入り、#generalチャネルのトピックを見ると、フラグが書いてあった。
flag{u3eD1scordf0rH3lp}
Sanity Check (Miscellaneous 5)
豚の学名を答える。
flag{Sus}
Toujours (Cryptography 25)
暗号文は以下のようになっている。
Dans la béatitude pour toujours Dans la félicité en une infinité Dans la gloire irrévocablement éternellement à perpétuité Dans la divinité pour toujours à perpétuité dans la lumière
https://www.dcode.fr/ave-maria-trithemeで復号する。
UORDLIKEPOEM
U,V,Wは同じ暗号なので、意味が通るように調整する。
flag{wordlikepoem}
Behind the Scene (Web Exploitation 5)
http://networking.freedomctf.org/.envにアクセスすると、以下のbase64らしき文字列が書いてあった。
mxhZ3sxeXQxNzE4MXk3ODE4OTE3MTcxfQ==
先頭に"Z"をつけて、base64デコードする。
$ echo ZmxhZ3sxeXQxNzE4MXk3ODE4OTE3MTcxfQ== | base64 -d flag{1yt17181y7818917171}
flag{1yt17181y7818917171}
IP Lookup (Networking 5)
networking.freedomctf.orgのIPを答える。
$ nslookup networking.freedomctf.org Server: 127.0.0.53 Address: 127.0.0.53#53 Non-authoritative answer: Name: networking.freedomctf.org Address: 18.189.22.84
flag{18.189.22.84}
Pretty Sunset (Forensics, Steganography 25)
jpgが添付されている。Stegsolveで開き、Blue plane 0を見ると、フラグが書いてあった。
flag{Hidden_l1ke_a_pro}
Zip Up Prep Up (Forensics, Steganography 5)
$ unzip flag.zip Archive: flag.zip extracting: flag/.hidden extracting: flag/flag extracting: flag/flag2 extracting: flag/flag3 extracting: flag/flag4 extracting: flag/flag5 extracting: flag/hidden extracting: flag/hidden1 extracting: flag/hidden2 extracting: flag/hidden3 extracting: flag/hidden4 $ cat flag/.hidden flag{h0wt0unz1pan43xtracta_7ile}
flag{h0wt0unz1pan43xtracta_7ile}
Bee Sixty Four (Cryptography 5)
base64文字列をデコードするだけの問題。
$ echo ZmxhZ3tSaWdodDBmZl90aGVfQjR0fQ== | base64 -d flag{Right0ff_the_B4t}
flag{Right0ff_the_B4t}
Assembly 1 (Reverse Engineering 5)
アセンブラファイルから実行ファイルを作成して実行する。
$ as -o Assembly1.o Assembly1.s $ gcc -o Assembly1 Assembly1.o $ ./Assembly1 flag{Assembly_is_fun_3dws9r}
flag{Assembly_is_fun_3dws9r}
Netting (Networking 5)
freedomctf.orgのIPアドレス、サブネットクラス、サブネットマスクを答える。
$ nslookup freedomctf.org Server: 127.0.0.53 Address: 127.0.0.53#53 Non-authoritative answer: Name: freedomctf.org Address: 172.67.178.180 Name: freedomctf.org Address: 104.21.88.120 Name: freedomctf.org Address: 2606:4700:3031::6815:5878 Name: freedomctf.org Address: 2606:4700:3033::ac43:b2b4
第一オクテットが172のため、Bクラスでサブネットマスクは255.255.0.0。
flag{172.67.178.180_B_255.255.0.0}
Stick Bug (Cryptography 25)
黄金虫の暗号。https://www.dcode.fr/gold-bug-poeで復号する。
PHRYGANISTRIA CHINENSIS
flag{phryganistria chinensis}
Networking Recon? (Networking 25)
Webサーバの使用サーバ名とバージョンを答える。
存在しないパスを指定してアクセスすると、Not Foundとなり、Webサーバの情報が表示された。
Apache/2.4.41 (Ubuntu) Server at networking.freedomctf.org Port 80
flag{Apache_2.4.41}
Failed Inspection (Web Exploitation 25)
ブラウザでアクセスすると、リダイレクトしているようだったので、curlでリダイレクトさせずにアクセスする。
$ curl https://failedinspection.freedomctf.org/ <!DOCTYPE html> <html> <head> <style> * { margin: 0; padding: 0; } body { background-color: rgb(197, 190, 190); font-family: "Lucida Handwriting"; font-size: 30px; } h1 { color: rgb(216, 129, 71); text-align: center; font-size: 60px; } h2 { color: rgb(80, 82, 105); text-align: center; font-size: 40px; } img { width: 185px; height: 259px; } .center-container { display: flex; width: 100%; justify-content: space-around; margin-top: 10vh; } </style> </head> <body> <h1>Inspector:</h1> <h2>Was your most recent inspection failed?</h2> <div class="center-container"> <div> Contact Michael C. Westfall today at: <ul style="margin-left: 5vw"> <li><a href="michael.westfall@osig.virginia.gov">Email</a></li> <li><a href="(804) 625-3255">Phone Number</a></li> <li><a href="(804) 786-2341">Fax</a></li> </ul> </div> <div> <img src="DeputyInspectorGeneral.jpg" /> </div> </div> <script> window.onresize = function () { if (window.outerHeight - window.innerHeight > 100) { // console was opened (or screen was resized) while(true){ window.open(); } } }; document.addEventListener("contextmenu", (event) => event.preventDefault() ); window.addEventListener("load", (event) => { // window.open(); window.close(); document.close(); }); document.onkeydown = function (e) { if (event.keyCode == 123) { return false; } if (e.ctrlKey) { return false; } return false; }; </script> </body> <!--Their inspection might have failed, but you passed! flag{N0_insp3ct_n0_prOb|3m}--> </html>
flag{N0_insp3ct_n0_prOb|3m}
Triangle (Forensics, Steganography 5)
$ exiftool triANGLE.png ExifTool Version Number : 10.80 File Name : triANGLE.png Directory : . File Size : 83 kB File Modification Date/Time : 2021:06:05 16:51:36+09:00 File Access Date/Time : 2021:06:05 16:52:14+09:00 File Inode Change Date/Time : 2021:06:05 16:51:36+09:00 File Permissions : rwxrwxrwx File Type : PNG File Type Extension : png MIME Type : image/png Image Width : 1688 Image Height : 828 Bit Depth : 8 Color Type : RGB with Alpha Compression : Deflate/Inflate Filter : Adaptive Interlace : Noninterlaced Author : flag{KVzPgxqTaKuBRAVRWaLs} Image Size : 1688x828 Megapixels : 1.4
!Apple (Reverse Engineering 50)
Bytecode Viewerで開き、デコンパイルする。
package com.example.apkchallenge; import android.os.Bundle; import android.view.View; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.example.apkchallenge.MainActivity.1; import com.example.apkchallenge.MainActivity.2; public class MainActivity extends AppCompatActivity { public void callLoginServices() { Volley.newRequestQueue(this).add(new StringRequest(0, "https://phaleroviamobile.freedomctf.org/secret-message", new 1(this), new 2(this))); } protected void onCreate(Bundle var1) { super.onCreate(var1); this.setContentView(2131427356); } public void sendLogin(View var1) { TextView var3 = (TextView)this.findViewById(2131231010); TextView var2 = (TextView)this.findViewById(2131230915); var3.getText().toString(); var2.getText().toString(); this.callLoginServices(); } }
https://phaleroviamobile.freedomctf.org/secret-messageにアクセスしてみるとフラグが書いてあった。
flag{Droid_Broid_bot}
Cap Cap (Networking 25)
ftp-dataの通信でフィルタリングする。その通信パケット中にあるpart1.png~part11.png、part13.pngの画像をエクスポートする。part12.pngはなかった。拡大・縮小しながら組み合わせると、一部が欠けたQRコードになる。
これをテキストにして読み込む。
$ cat qr.txt XXXXXXX_X_XXXXX___XXXXXXX X_____X_XX____X_X_X_____X X_XXX_X__XXX_X__X_X_XXX_X X_XXX_X_X_XXXX_XX_X_XXX_X X_XXX_X__XXX_X_X__X_XXX_X X_____X___X__X____X_____X XXXXXXX_X_X_X_X_X_XXXXXXX ________XXX_X__X_________ X_XX_XXX___XX_____X__X_XX XXXXX__X_XXX__X_X__X_X___ XX_XXXXX___X_XX_X_XXXX___ __XXX_______XXXX__XX_XX__ _X_X_XXXXX___X_X_XXXXXXX_ _X_X______XX___XXXX_XX_XX _XXX_XXX_X__XXX__X_X_X_X_ X___XX_XX___X__XXX__X____ ____XXXX_XXX_X_XXXXXXXX__ ________X___X_X_X___X???X XXXXXXX_XXXXX_X_X_X_X???X X_____X_XX__X__XX___X???X X_XXX_X___XXXX__XXXXX____ X_XXX_X_XX__XX___XX?????X X_XXX_X_XX_XXX_____?????_ X_____X__XX____X_XX?????_ XXXXXXX_XXX_X_XX_X_?????X $ python sqrd.py qr.txt flag{fix1ng_1mgs18934}
flag{fix1ng_1mgs18934}
RSA-ONE (Cryptography 5)
p, qがわかっているので、そのまま復号する。
from Crypto.Util.number import * p = 13096400414421552156969028937353174744908047161155295408964887163262826826036521470217012894200517287339110399380688376522626855275687133288684619779082547 q = 12840054857178763772230365613402198055084749343413307404027010001945719437978924658864009419366334955476170242725335489155132647907960715147801905246920609 e = 65537 ct = 32305409026163713222859212354020077015304928685327842744369445191616303537762118069639355953458045773045005993195097944549512923751703719047488817344339599720835627540521189095721269570852022720021666021201899667129233207585472537514546031754665930962489472140040978466147507216004529382189503453518588974947 phi = (p - 1) * (q - 1) d = inverse(e, phi) m = pow(ct, d, p * q) flag = long_to_bytes(m) print flag
flag{hellothisisthersaanswer}
CRT0-Q1 (Cryptography 5)
暗号化の処理概要は以下の通り。
・encr(apjubh(phrase)) ・apjubh() 文字列の順序を逆にする ・encr() ・key:1~5のランダム値 ・keyだけシフト ・~をZに置換 ・%をQに置換
keyの5パターンについて、元に戻して英単語として成り立つものを選択する。
enc = 'l4butzb9`b`oJ`fmef4O' enc = enc.replace('Z', '~') enc = enc.replace('Q', '%') for key in range(1, 6): dec = '' for i in range(len(enc)): dec += chr(ord(enc[i]) - key) flag = 'flag{%s}' % dec[::-1] print flag
実行結果は以下の通り。
flag{N3edle_In_a_8aysta3k} flag{M2dckd^Hm^`^7`xrs`2j} flag{L1cbjc]Gl]_]6_wqr_1i} flag{K0baib\Fk\^\5^vpq^0h} flag{J/a`ha[Ej[][4]uop]/g}
flag{N3edle_In_a_8aysta3k}
RSA-TWO (Cryptography 25)
nをfactordbで素因数分解する。
n = 12968523063040435873 * 14978383016497116121
あとはそのまま復号するが文字にならない。復号した数値を3桁ごとに区切り、ASCIIコードとしてデコードする。
from Crypto.Util.number import * e = 23 n = 194247505596496023881578032915335008633 ct1 = 65205298022099085283449917096537195340 ct2 = 152080695252271793478056704090860133614 p = 12968523063040435873 q = 14978383016497116121 assert n == p * q phi = (p - 1) * (q - 1) d = inverse(e, phi) m1 = pow(ct1, d, n) m2 = pow(ct2, d, n) s_m1 = str(m1) s_m2 = str(m2) flag = '' for i in range(0, len(s_m1), 3): flag += chr(int(s_m1[i:i+3])) for i in range(0, len(s_m2), 3): flag += chr(int(s_m2[i:i+3])) print flag
flag{rsa_trouble_dyx1x}
CRT1-Q2 (Cryptography 25)
暗号処理の概要は以下の通り。
・フラグを5行8列に横に並べ、空きの箇所は"Z"で埋める。 ・縦に読み、文字列にする。 ・順を逆にする。
以上を元に逆算する。
enc = '74CEE12EB1C1A00FF30FD37B74EF2477B37C957D' enc = enc[::-1] flag = '' for r in range(5): for c in range(8): flag += enc[r + c * 5] flag = 'flag{%s}' % flag print flag
flag{D747F01E732B00BE5BF73AEC97E3F124C74DFC17}
Enigma (Cryptography 25)
条件を元にring settingのブルートフォースで復号する。hintを見ると次のように書いてあるので、条件を満たすもののみ出力する。
Three decoded characters in the flag are: 'loo'
from enigma.machine import EnigmaMachine import itertools ciphertext = 'cazmgsczlrkrkmnlhsvvma' for ring in itertools.product(range(26), repeat=3): machine = EnigmaMachine.from_key_sheet( rotors = 'I II III', reflector = 'B', ring_settings = list(ring), plugboard_settings='GD HR IC KO ML QU PZ WA FN BS') machine.set_display('IQL') plaintext = machine.process_text(ciphertext.upper()) if 'loo' in plaintext.lower(): print plaintext
実行結果は以下の通り。
EPSCKMOREBHVVZMJTRJLOO UNSJMYLOOOZTPDKQZRFENK YCQSLOOXBVGQWTWJPEINSD QLUCLHUCPLOOHCRUSCJCQP XCIHUMILOOIYWIBYTUEMBG VSDLOOQBIZPHGBXGIRASPG JZQNTQJRUILOOTZIKOIQES HLOOSAIXWTYWTXUIXTNYUQ PMAKLTULOOXONXRXCHQXIH TLVIBEUGTOXVQFXCYXLOOK BKIQDRJUQGLOOTQQIRCQSJ AUCRLOOAFUGTYWURQJXFGO XOWQILGOOQIXTLOOAUAHAH MEFODUPLOOIKPYCCIKYBYE UENFWRFLVLOOQCPQZHDRGQ ENGIMAANDLOOPISNOTHARD★ LLQFDDLOOYVFJVPSQNGJGQ FKLOOMXXKBZKHPWEPVIUNJ WQOCKEDGSSLOOKEFTCTPZR LCTGAMVFUFWSJLOOALOPCC LOOKKZAMSSSXNSUKPLBTJY INADUDMYNHBMLOORNYAZXP FYOZKLOOWKBYOSZWVGYQJK DLRNJAFINPNXEWOSDALOOY
flag{ENGIMAANDLOOPISNOTHARD}