The Numbers
/icons/hr.icon
Write up t6o_o6t.icon
清書した解説ではなく、t6o_o6t.iconが考えながら書き残したメモです。
考え方の参考にしてほしいです。
numbers ファイルをダウンロードしたが、単なるPNG画像である $ file the_numbers.png
the_numbers.png: PNG image data, 774 x 433, 8-bit/color RGB, non-interlaced
$ binwalk the_numbers.png
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 PNG image, 774 x 433, 8-bit/color RGB, non-interlaced
91 0x5B Zlib compressed data, compressed
PNG imageの直後に圧縮データが入っているが、PNG部分が小さすぎるから、これはPNGのデータと判断
$ head -c 50 the_numbers.png | xxd
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
00000010: 0000 0306 0000 01b1 0802 0000 0057 f436 .............W.6
00000020: 6700 0000 0173 5247 4200 aece 1ce9 0000 g....sRGB.......
00000030: 0004 ..
画像を開いてみる
16 9 3 15 3 20 6 {
20 8 5 14 21 13 2 5 18 19 13 1 19 15 14
}
先頭に7つの数字 + { } という形は、フラグを意味していそうt6o_o6t.icon
picoCTF{}という文字列を暗号化している?
どういう暗号化の方法だろうか?
16 → p
9 → i
3 → c
ここで気づいたが、cを3としたとき、アルファベット順でiは9だ
アルファベットの順番を当てはめるだけで良さそうだ
注:ケース = 大文字、小文字
picoCTFは、「CTF」が大文字なはずだ
大文字と小文字の区別がないようだ
picoCTF{}は決め打ち
中のFLAGは、すべて小文字か大文字にして解答すれば良さそうt6o_o6t.icon
以下のようなコードを書く
code:solve.py
# 入力値(the numbers)
s = "16 9 3 15 3 20 6 { 20 8 5 14 21 13 2 5 18 19 13 1 19 15 14 }"
# 得たい答え
ans = ""
# 入力値は空白区切りで定義したので、splitでリストに分割する
for part in s.split():
# { と } はそのまま出力する
if not part.isnumeric():
ans += part
continue
# アルファベットの a を 1 としたいので、 a の文字コードに、各 number から 1 引いた数を足し合わせる
ans += chr(ord('a') + int(part) - 1)
print(ans)
$ python3 solve.py
picoctf{thenumbersmason}
フォームには、ctfをCTFに書き換えた文字列を入力して、解けました