UECTF2022 Writeup
はじめに
UECTF2022、shinozakiaiというユーザー名で参加して20位でした。Writeupを書きます。
逆Writeup(解けなかった問題を復習することを勝手にそう呼んでます)もセットで書くつもりだったんですが、丁寧、丁寧、丁寧にやりたいので別記事にしようと思います。
感想
私にはちょうどいい難易度で、比較的たくさん解けて面白かったです。特にMISCにユニークな問題が多かった印象です。運営の皆様、ありがとうございました。
WEB
webapi
HTMLにベタ書きされているFLAG_URLを見ればflag。
request-validation
ソースコードを読むと、GETパラメータ q
がobjectならflagがもらえるみたい。
if (req.query.q && typeof req.query.q === 'object') {$ res.send(FLAG)$
どうしたらobject扱いになるかなーと思って、ローカルで立ち上げた環境に ?q={'test': 'test'}
など色々投げてたら、?q=test1&q=test2
でflag。
FORENSICS
Compare
バイナリ同士を比較する cmp
というコマンドがあることを知る。見た目は一緒だけど、差分はあるみたい。
$cmp -l UECTF_org.bmp UECTF_new.bmp 101845 377 125 102818 377 105 103839 377 103 104752 377 124 105401 377 106 106038 377 173 106639 377 143 107228 377 157 107757 377 155 108406 377 160 109103 377 141 109848 377 162 110605 377 145 111218 377 137 111855 377 164 112504 377 167 113141 377 157 113754 377 137 114379 377 146 115040 377 151 115593 377 154 116326 377 145 116939 377 163 117480 377 137 118285 377 142 118874 377 171 119523 377 164 120040 377 145 120605 377 137 121170 377 142 121819 377 171 122384 377 137 123033 377 142 123574 377 171 124103 377 164 124668 377 145 125065 377 175
この 125
とか 105
をPythonで chr()
したりすればいいのか?と思うもなんかうまくいかず。しかたがないのでorgとnewそれぞれの xxd
の出力を保存して diff
で比較した。差分になっている箇所が UECTF{
となっているので、温かみのある手作業でflagを組み立てた。
377ってなんだ?
$diff -u org new | grep ^+ +++ new 2022-11-26 15:35:15.396738997 +0900 +00018dd0: ffff ffff 55ff ffff ffff ffff ffff ffff ....U........... +000191a0: ff45 ffff ffff ffff ffff ffff ffff ffff .E.............. +00019590: ffff ffff ffff ffff ffff ffff ffff 43ff ..............C. +00019920: ffff ffff ffff ffff ffff ffff ffff ff54 ...............T +00019bb0: ffff ffff ffff ffff 46ff ffff ffff ffff ........F....... +00019e30: ffff ffff ff7b ffff ffff ffff ffff ffff .....{.......... +0001a080: ffff ffff ffff ffff ffff ffff ffff 63ff ..............c. +0001a2d0: ffff ffff ffff ffff ffff ff6f ffff ffff ...........o.... +0001a4e0: ffff ffff ffff ffff ffff ffff 6dff ffff ............m... +0001a770: ffff ffff ff70 ffff ffff ffff ffff ffff .....p.......... +0001aa20: ffff ffff ffff ffff ffff ffff ffff 61ff ..............a. +0001ad10: ffff ffff ffff ff72 ffff ffff ffff ffff .......r........ +0001b000: ffff ffff ffff ffff ffff ffff 65ff ffff ............e... +0001b270: ff5f ffff ffff ffff ffff ffff ffff ffff ._.............. +0001b4e0: ffff ffff ffff ffff ffff ffff ffff 74ff ..............t. +0001b770: ffff ffff ffff ff77 ffff ffff ffff ffff .......w........ +0001b9f0: ffff ffff 6fff ffff ffff ffff ffff ffff ....o........... +0001bc50: ffff ffff ffff ffff ff5f ffff ffff ffff ........._...... +0001bec0: ffff ffff ffff ffff ffff 66ff ffff ffff ..........f..... +0001c150: ffff ffff ffff ffff ffff ffff ffff ff69 ...............i +0001c380: ffff ffff ffff ffff 6cff ffff ffff ffff ........l....... +0001c660: ffff ffff ff65 ffff ffff ffff ffff ffff .....e.......... +0001c8c0: ffff ffff ffff ffff ffff 73ff ffff ffff ..........s..... +0001cae0: ffff ffff ffff ff5f ffff ffff ffff ffff ......._........ +0001ce00: ffff ffff ffff ffff ffff ffff 62ff ffff ............b... +0001d050: ffff ffff ffff ffff ff79 ffff ffff ffff .........y...... +0001d2e0: ffff 74ff ffff ffff ffff ffff ffff ffff ..t............. +0001d4e0: ffff ffff ffff ff65 ffff ffff ffff ffff .......e........ +0001d710: ffff ffff ffff ffff ffff ffff 5fff ffff ............_... +0001d950: ff62 ffff ffff ffff ffff ffff ffff ffff .b.............. +0001dbd0: ffff ffff ffff ffff ffff 79ff ffff ffff ..........y..... +0001de00: ffff ffff ffff ffff ffff ffff ffff ff5f ..............._ +0001e090: ffff ffff ffff ffff 62ff ffff ffff ffff ........b....... +0001e2b0: ffff ffff ff79 ffff ffff ffff ffff ffff .....y.......... +0001e4c0: ffff ffff ffff 74ff ffff ffff ffff ffff ......t......... +0001e6f0: ffff ffff ffff ffff ffff ff65 ffff ffff ...........e.... +0001e880: ffff ffff ffff ffff 7dff ffff ffff ffff ........}.......
Deleted
ディスクイメージは binwalk
と foremost
かけときゃええやろ精神で、 foremost
で画像ファイルがいくつか発掘できた。漁ったらflagが描いてあるファイルがあった。
Discord 1
ワンライナーで画像ファイルを列挙して、片っ端から確認した。
$find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' ./Cache/f_00002b: PNG image ./Cache/f_00002c: PNG image ./Cache/f_00002f: PNG image ./Cache/f_00003a: PNG image ./Cache/f_00008b: PNG image ./Cache/f_00008c: PNG image ./Cache/f_00008d: PNG image ./Cache/f_00008e: PNG image ./Cache/f_00008f: PNG image ./Cache/f_000090: PNG image ./Cache/f_000091: PNG image ./deafen-off-light.png: PNG image ./disconnect-light.png: PNG image ./mute-off-light.png: PNG image ./tray-connected.png: PNG image ./tray-deafened.png: PNG image ./tray-muted.png: PNG image ./tray-speaking.png: PNG image ./tray-unread.png: PNG image ./tray.png: PNG image ./video-light.png: PNG image
Discord 2
grep
。
$grep -r UECTF . grep: ./Local Storage/leveldb/000004.log: binary file matches
MISC
WELCOME
割愛。
caesar
以下のコードでflagをエンコードしている。なんかあんまり細かいこと考えずに、 letter[(index+14)%len(letter)]
のとこを letter[(index-14)%len(letter)]
にした関数を decode()
として使ったら復号できた。
from string import ascii_uppercase,ascii_lowercase,digits,punctuation def encode(plain): cipher='' for i in plain: index=letter.index(i) cipher=cipher+letter[(index+14)%len(letter)] return cipher ascii_all='' for i in range(len(ascii_uppercase)): ascii_all=ascii_all+ascii_uppercase[i]+ascii_lowercase[i] letter=ascii_all+digits+punctuation plain_text='UECTF{SECRET}' cipher_text=encode(plain_text) print(cipher_text)
こういうの、読むのも嫌になってしまうというか、自分がやりたいCTFはこういうのじゃねえ!と逃げてしまう。
reduction gone wrong 1
黒塗りの箇所をコピペすると「nope」がでてきてぐぬぬ……となった。 「ctf pdf 黒塗り」でググったらLibreOfficeでなんとかしたという記事がでてきたので、そのようにしてflag。
reduction gone wrong 2
Windows10標準のペイントで輝度をガンガン上げまくってflag。
GIF1
GIFの中で一瞬flagが表示される。GIMPをダウンロードするのが面倒だったので、Windows+Gで起動する録画機能で録画した。
WHEREAMI
ヒントを見て、これが「plus code」なるものだということが分かった。
plus code を使用して場所を検索、共有する - Android - マップ ヘルプ
1行が1地点を示しているとすると、たくさんあるし、いくつか試すと太平洋というだだっ広いところを示しているようだったので、きっと全部にピンを打ったらflagが浮かび上がるんだろうなと想像がついた。
ので、その方法を探すと以下のページにたどり着いた。スプレッドシートに列挙した地理情報を、まとめてインポートできるみたいだ。
Googleマップ:住所録から地図に一括マークアップする方法(マイマップ作成) - Fans!Google
やってみたらflag。面白い問題だった。
OSINT
IDを変更したTwitterアカウント( https://twitter.com/__yata_nano__ )をネトストする問題。
Wayback machineでアーカイブを発見。
https://web.archive.org/web/20221026140525/https://twitter.com/__yata_nano__
ツイートの中身からは、新IDに関する情報は見つからず。色々ググっていたら、ユーザーに変更不可能なIDが割り当てられていることが分かった。
アーカイブのソースを見てみたら、それらしきものが書かれている。
以下のURLにアクセスすると、新ユーザーIDのアカウントへリダイレクトされる。pastebinのURLをツイートしていて、そこでflagを入手した。UECTF
なんかを検索することで辿り着かせないためだと思うけど、手が込んでいるなあと思った。自分だったら適当に検索避けするとか画像とかで済ませちゃいそうだけど、こういう方法もあるんだな。
https://twitter.com/intent/user?user_id=1585261641125416961
REV
A file
うおおおお
$ strings chall | grep UECTF UECTF{Linux_c0mm4nDs_ar3_50_h3LPFU1!}