進行中の何か

主にIT系の調べたこと。やったことをまとめます。

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}でした。