picoCTF 2017 Level2 writeup 04
日が空いてしまってGoogle CTFは閉じてしまったのでpicoCTF 2017を再び解いていく!
Little School Bus
ステガノグラフィー問題。
Hintにもある通り、「least significant bit」を抽出する必要がある。
Windowsのツールを使えば一発でとけたのだけど
自身の学習も兼ねてpythonで解いていく。
気を付けないといけないのは
BMPはBGRで記録されているのでRGBで解こうとするとはまる。(1敗)
from PIL import Image import binascii import re img = Image.open('littleschoolbus.bmp','r') # width heightを取得 w,h = img.size bits="" for y in range(h): for x in range(w): r,g,b = img.getpixel((x,y)) # 2進数に変換してbgrの順番でlsbを抽出し追加 bits+= str("{0:b}".format(b))[-1] bits+= str("{0:b}".format(g))[-1] bits+= str("{0:b}".format(r))[-1] # 16進数に変換 bin=str("{0:x}".format(int(bits,2))) # 奇数だとasciiに変換できないので奇数の場合は一つ削る odd = len(bin)%2 hex = str(binascii.a2b_hex(bin[:-odd])) # flagはflag{}形式なので正規表現で検索し、マッチした文字を表示 flag=re.search('(flag{.*})',hex) print(flag.group(0))
実行した結果flagはflag{remember_kids_protect_your_headers_1ba9}
Missing Identity
Master Challengeにも挑戦してみる。
fileをダウンロードしてきて答えはzから始まる文字とのこと。
まずはfileコマンドで調査し、zipであることがわかったので
早速展開してみるがbad zipfile offsetと出ている。
# file file file: Zip archive data, made by v?[0x314], extract using at least v2.0, last modified Sun Aug 9 21:48:18 2009, uncompressed size 37151, method=deflate # unzip file Archive: file file #1: bad zipfile offset (local header sig): 0 inflating: nottheflag1.png inflating: nottheflag2.png inflating: nottheflag3.png inflating: nottheflag4.png
ということでhexdumpしてみるとやっぱりシグネチャがXXXXになっている。
# hexdump -C file | more 00000000 58 58 58 58 58 58 00 00 08 00 22 44 7f 4a 7d a9 |XXXXXX...."D.J}.| 00000010 1e ff f2 90 00 00 1f 91 00 00 08 00 00 00 66 6c |..............fl| (省略)
なので ZIP (ファイルフォーマット) - Wikipedia で調べたシグネチャに書き換える。
# hexdump -C file | more 00000000 50 4b 03 04 00 00 00 00 08 00 22 44 7f 4a 7d a9 |PK........"D.J}.| 00000010 1e ff f2 90 00 00 1f 91 00 00 08 00 00 00 66 6c |..............fl| (省略)
あとは展開するとさっきは存在しなかったflag.pngが出力される。
# unzip file Archive: file inflating: flag.png
flagはflag.pngの画像の内容を読めばOK
flagはflag{zippidooda88938568}
でした。