解き終えたpico ctfのwrite upを随時更新していきます。LLMを一切使わずに通常の検索のみで解いており、最適解とは限りません。
また、既存のwriteupの参照も控えています。
PicoCTFのプロファイルはこちら:picoCTF - re4lity Profile
環境構築
使用するOS;Windows 11 Pro 24H2
ブラウザの操作はwindows上で行い、そのほかの解析はdocker desktopで構築したkali linuxを使って行う。
dockerのよく使うコマンド(インストールは省略)
1
|
docker start <コンテナ名またはID>
|
1
|
docker exec -it <コンテナ名またはID> /bin/bash
|
windows側からのファイルのやり取りをする場合に備え、別ウィンドウでkaliに入るのがおすすめ
1
|
docker cp <Windoes上のファイルパス> <コンテナ名またはID>:<Docker上のファイルパス>
|
逆も同様に、ファイルパスの順番が違うだけ
Write Up
解きながらのメモを中心に書いていきます。
PDFからFlagを探す問題
PDFはフォントを背景色にあわせたり、黒塗りにするなどして、テキスト情報を入れ込みながらも視覚上からは隠すことができる
PDF Footprint Finder
このサイトはPDF上の文字情報を読み取ってくれる
しかし今回は文中にFlagはない。
ただし、著者の欄の文字列が怪しいので解析してみる
Author: cGljb0NURntwdXp6bDNkX20zdGFkYXRhX2YwdW5kIV8wZTJkZTVhMX0=
文字列の暗号化の基本的な方法としてはROT_13、Base64、Asciiコードへの変換などがポピュラーでわかりやすい。
文字列系の解析はCyberChefというサイトが有用である。
今回はfrom base64のメニューを使って復号化に成功し、Flagを取れた。
ログファイル(server.log)からFlagを探す
普通に Vscodeで開ける
FLAGPARTというラベルのあるINFOにFlagの情報がありそう。
4種類あって、それが繰り返されているので、順番につなげて出してFlagを取れた
.pngファイルから探す
普通に画像として開ける
しかし画像の視覚情報では何もわからない
メタデータを見てみる
kaliに送ってfileコマンドで見てみると
1
2
3
|
┌──(root㉿1bc27362dfb1)-[~]
└─# file plainsight.png
plainsight.png: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, comment: "c3RlZ2hpZGU6Y0VGNmVuZHZjbVE9", baseline, precision 8, 640x640, components 3
|
c3RlZ2hpZGU6Y0VGNmVuZHZjbVE9というコメントが匂うので cybershefでみてみる。rotかな?
base64でデコードすると
steghide:cEF6endvcmQ=
となった
steghideが使われているっぽい
cEF6endvcmQ=
というフレーズも怪しいのでさらにbase64復号してみるとpAzzwordという単語になった。
steghide info <ファイル名>でsteghideを用いてメッセージが埋め込まれているか確認することができる。ただし正しいパスフレーズを入れないと解析できないので、今回のように周辺情報からパスフレーズを推測できる必要があるっぽい
1
2
3
4
5
6
7
8
9
10
11
|
┌──(root㉿1bc27362dfb1)-[~]
└─# steghide info plainsight.png
"plainsight.png":
format: jpeg
capacity: 4.0 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase:
embedded file "flag.txt":
size: 34.0 Byte
encrypted: rijndael-128, cbc
compressed: yes
|
実際にデータを抽出する場合は
1
|
steghide extract -sf <ファイル名> [オプション]
|
でできる。これでFlagを取れた。
超大きいログファイルの解析
iVBORw…となっている部分を調べると、base64形式でエンコードされた画像形式であるらしい。
なのでbase64でデコードし、拡張子を.pngとか.jpegにすれば見れるのでは?
見れた
画像の中に
1
|
7069636F4354467B666F72656E736963735F616E616C797369735F69735F616D617A696E675F62653836303237397D
|
という文字列アリ。
HEXからのデコードでflagを取れた。結構てこずった
ソースに
ABGR: Wnpx - grzcbenel olcnff: hfr urnqre “K-Qri-Npprff: lrf”
という文字列があり、base13で解読すると
NOTE: Jack - temporary bypass: use header “X-Dev-Access: yes”
となった
ctf-player@picoctf.org は問題文で与えられているメールアドレス。
検証用の画面を開いた状態で一回素のブラウザでログインを試行してみる。
そうするとネットワークタブに「login」という名前で失敗したログイン試行が記録されている。
このリクエストに’X-Dev-Access: yes’ を付ければよい。
ログイン試行の行を右クリック→Copy as cURL(bash)からコピー。
kali で張り付けるとcurlのリクエストとして張り付けられる。便利。
そこのヘッダー部分に先ほどのx dev accessを付けて再度送信してみると、、
1
2
3
|
┌──(root㉿1bc27362dfb1)-[~]
└─# curl 'http://amiable-citadel.picoctf.net:57824/login' -H 'Accept: */*' -H 'Accept-Language: ja,en;q=0.9' -H 'Cache-Control: no-cache' -H 'Connection: keep-alive' -H 'Content-Type: application/json' -H 'Origin: http://amiable-citadel.picoctf.net:57824' -H 'Pragma: no-cache' -H 'Referer: http://amiable-citadel.picoctf.net:57824/' -H 'X-Dev-Access: yes' \ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36' --data-raw '{"email":"ctf-player@picoctf.org","password":"sg"}' --insecure
{"success":true,"email":"ctf-player@picoctf.org","firstName":"pico","lastName":"player","flag":"picoCTF{brut4_f0rc4_hogehoge}"}curl: (3) URL rejected: Malformed input to a URL function
|
としてレスポンスにフラグがはいっている。
拡張子なしのファイルの解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
┌──(root㉿1bc27362dfb1)-[~]
└─# file corruptedfile
corruptedfile: data
┌──(root㉿1bc27362dfb1)-[~]
└─# exiftool corruptedfile
ExifTool Version Number : 13.25
File Name : corruptedfile
Directory : .
File Size : 8.8 kB
File Modification Date/Time : 2025:11:19 15:55:25+00:00
File Access Date/Time : 2025:11:19 15:57:19+00:00
File Inode Change Date/Time : 2025:11:19 15:57:08+00:00
File Permissions : -rwxr-xr-x
Error : Unknown file type
|
file , exiftoolは効果なし
1
2
3
4
5
6
7
|
┌──(root㉿1bc27362dfb1)-[~]
└─# xxd corruptedfile | head -n 5
00000000: 5c78 ffe0 0010 4a46 4946 0001 0100 0001 \x....JFIF......
00000010: 0001 0000 ffdb 0043 0008 0606 0706 0508 .......C........
00000020: 0707 0709 0908 0a0c 140d 0c0b 0b0c 1912 ................
00000030: 130f 141d 1a1f 1e1d 1a1c 1c20 242e 2720 ........... $.'
00000040: 222c 231c 1c28 3729 2c30 3134 3434 1f27 ",#..(7),01444.'
|
JFIFはjpegファイルの冒頭にあるものらしい。
しかしこの状態でmvを使って.jpegを付けてもファイルを正常に開けなかった。
冒頭の\xの部分はいつも見かけないので、これを取ってみる
JPEG画像の「中身」は一体どうなっているのか? - GIGAZINE
によると、ファイル冒頭は
のようになっているらしい。
hexeditをインストールし、そこでバイナリを編集した。
1
2
|
┌──(root㉿1bc27362dfb1)-[~]
└─# hexedit corruptedfile
|
編集が完了したら、crtl + xで編集画面から抜けられる
1
2
3
4
5
6
7
8
9
|
┌──(root㉿1bc27362dfb1)-[~]
└─# xxd corruptedfile | head -n 4
00000000: ffd8 ffe0 0010 4a46 4946 0001 0100 0001 ......JFIF......
00000010: 0001 0000 ffdb 0043 0008 0606 0706 0508 .......C........
00000020: 0707 0709 0908 0a0c 140d 0c0b 0b0c 1912 ................
00000030: 130f 141d 1a1f 1e1d 1a1c 1c20 242e 2720 ........... $.'
┌──(root㉿1bc27362dfb1)-[~]
└─# mv corruptedfile corruptedfile.jpeg
|
しっかり修正できていた。
1
2
|
C:\Users\USER>docker cp kali-steg:/root/corruptedfile.jpeg "C:\Users\USER\Desktop\一時用\picoCTF\corruptedfile.png"
Successfully copied 10.8kB to C:\Users\USER\Desktop\一時用\picoCTF\corruptedfile.png
|
windows側に持っていき、GUIで画像を開くとフラグを取れた
気づきなど
- 「=」で終わる意味不明なb文字列は大体base64の確率が高い
- kali linux使いやすい
- CyberChefの使い勝手が良い。いろんな方式を同一UIでとっかえひっかえ試せるのがいいね