チーム Harekaze で DoubleS1405 CTF に参加しました。最終的にチームで 881 点を獲得し、順位は 9 位 (得点 130 チーム中) でした。うち、私は 6 問を解いて 400 点を入れました。
以下、解いた問題の write-up です。
EXIF 付きの JPEG が渡されるので、撮影された場所の住所を答えろという問題でした。
私が問題を見た時点で @hiww さんが 238-1 Ui-dong, Gangbuk-gu, Seoul, South Korea
という感じの場所であると特定されていました。
問題文には
(The correct answer is the address in Korea. Example: 대한민국 부산광역시 ~~구 ~~동 37-21)
とあります。Google 翻訳に投げてみるとこれは 大韓民国釜山広域市~~区~~洞37-21
であると分かります。
釜山広域市をソウル特別市 (서울특별시
) に、○○区を江北区 (강북구
) に、○○洞を牛耳洞 (우이동
) に変えてフォーマットを合わせると正解になりました。
대한민국 서울특별시 강북구 우이동 238-1
今問題を確認したところ問題文に英語での例が記載されていたんですが、途中で修正されたんでしょうか。
まず flag is
になりそうな部分が zczk zg
になっているためヴィジュネル暗号で暗号化されているとエスパーしました。
平文が the vigenere
から始まるとすると鍵は onefourzerofive
になります。これを使って復号するとフラグが得られました。
hello_vigenere
import re
s = open('Crypto.txt', 'r').read()
print ''.join(chr(int(n)) for n in re.findall(r'\[(\d+)\]', s))
で [123]
という感じで []
に囲まれている数字を集めて文字列にすると {R0+VGPIO_N0J_3DAKT_1I}
という文字列が得られました。
これをシーザー暗号として右に 11 ずらすと c0+gratz_y0u_3olve_1t
という文字列が得られました。
c0ngratz_y0u_3olve_1t
Matroska 形式の動画が与えられます。
VLC Player で再生してみると eh~!@#~!!#!@#!@!#!#@!#!
という感じの字幕が表示されました。
mkvextract tracks file 2:subtitles.srt
で字幕を抽出してみるとフラグが得られました。
v3r_cut3_p4Rr0t_12nt_!t?
USB キーボードでいろいろ打っている様子をキャプチャした pcap ファイルが与えられます。
HID Usage Tables を参考に 1 文字ずつ打っていた文字を調べるとフラグが得られました。
pl4y_th3_k3yb0ard
<?php
$directory = $_GET['dir'];
$cond = explode("=", urldecode($_SERVER['QUERY_STRING']));
if (!is_dir($cond[1])) echo 'folder does not exist.';
else {
$directory = new DirectoryIterator($directory);
foreach($directory as $file) {
echo '<!--';
if (preg_match("/txt$/i", $file->getFilename())) echo $file->getFilename() . "<br>";
echo '-->';
}
}
?>
というコードの Web サービスが動いていました。
わざわざ $directory
と $cond
を分けてチェックしているのが気になります。これは ?%3D.%3D&dir=.
で回避ができました。
DirectoryIterator について調べてみると、PHP のマニュアル で glob://
が使えると分かります。
あとは ?%3D.%3D&dir=glob://y0u-[n-s]
?%3D.%3D&dir=glob://y0u-[n-q]
… という感じで人力で二分探索をしていくと y0u-solv3d*the*probl3m!/FLAG*e43f7b51696e3524063c54cb1f7fcdbc*
というファイルがあると分かりました。
e43f7b51696e3524063c54cb1f7fcdbc