読者です 読者をやめる 読者になる 読者になる

Writeup memo Pretty Raw (Forensics150) [SharifCTF 7]

SharifCTF 7の Pretty Raw (Forensics150) のWriteupメモ

http://ctf.sharif.edu/ctf7/

  • 問題文

Pretty Raw

What is this file?

http://ctf.sharif.edu/ctf7/api/download/17

  • ファイルを確認
$ file pretty_raw
pretty_raw: data
$ strings pretty_raw
---------------------------
IHDR
PLTELiq
1yy>
(略)
)+0IDBVG?KMQSajO{
IDATx
8/Sd
(略)
\70S
0r\o
IEND
---------------------------

IHDRとかIDATとかIENDとかあるのでPNGファイルが隠れているものと想定。

  • binwalkで確認。
$ binwalk pretty_raw

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
116254        0x1C61E         PNG image, 1434 x 1060, 8-bit colormap, non-interlaced
  • foremostでファイルを抜き出し。
$ foremost pretty_raw
Processing: pretty_raw
|*|

output ディレクトリにファイルが生成される。

$ find output/
output/
output/audit.txt
output/png
output/png/00000227.png

PNGファイル抜き出し。

  • ファイルを見てみる。

f:id:sh1njp:20161219025251p:plain

flag.pngをexiftoolで見た結果の画像ファイル?

1570×74ピクセルのflag.pngというのがflagらしい。横長い画像。

foremostで出てきたPNGファイルがflagというわけではない。

f:id:sh1njp:20161219023728p:plain

下の方のノイジーなのが、PNGファイルで、上の方は黒(00)が多い。 何かしら前半のデータから、画像を生成するものと想定する。

  • hexdumpで眺める。
$ hexdump -v pretty_raw
0000000 0000 0000 0000 0000 0000 0000 0000 0000
0000010 0000 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
0000030 0000 0000 0000 0000 0000 0000 0000 0000
0000040 0000 0000 0000 0000 0000 0000 0000 0000
(略)
0002570 0000 0000 0000 0000 0000 0000 061b 1e1e
0002580 1e1e 141e 0000 0000 0000 0000 0000 0000
0002590 0000 0000 0000 0000 0000 1d08 1e06 1e1e
00025a0 1e1e 1e1e 1e1e 1e1e 0001 0000 0000 0000
00025b0 0000 0000 0000 0000 0000 0700 0302 1e09
(略)

なんとなく画像に見えてきたので(?)、PNGファイルのあった 116254 より前を切り出し。

$ dd if=pretty_raw count=116253 bs=1 of=pretty_raw_first.bin
116253+0 レコード入力
116253+0 レコード出力
116253 bytes (116 kB, 114 KiB) copied, 0.217263 s, 535 kB/s
  • 文字数をカウント

hexdumpの出力結果のアドレス部・空白・改行を除いてカウント。

hexdump -v pretty_raw_first.bin | cut -c8- | tr -d '\n' | tr -d ' ' | wc
      0       1  232508

⇒ 232508文字

  • 最初に抜き出したPNGファイルの情報のflag.pngの縦の「74」で割り算してみる
$ python
>>> 232508/74
3142
>>> 3142/2
1571
>>>

3140×74 (1570×2×74)となりそう。2文字=1ピクセルの画像。

  • 3140行毎に改行入れたテキストの出力
hexdump -v pretty_raw_first.bin | cut -c8- | tr -d '\n' | tr -d ' ' | nkf -f3140-0 > flag.txt

テキストエディタで、flag.txt を見てみる。

f:id:sh1njp:20161219023746p:plain

(長い)

  • ImageMagickでテキスト(flag.txt)を画像(flag.png)に画像にしてみる。
$ convert -pointsize 2 label:@flag.txt flag.png

ImageMagickの/etc/ImageMagick-6/policy.xmlで一時的に@を許可して実行しています。

$ cat -n /etc/ImageMagick-6/policy.xml
----------------------------------------------------------------------
    68    <!-- policy domain="path" rights="none" pattern="@*" />
----------------------------------------------------------------------

f:id:sh1njp:20161219023736p:plain

  • flag

SharifCTF{100ae53903cbb68ab523c8e858034988}