Void. Empty. Null. DownoadPNG画像のようですが表示することができません。バイナリエディタで確認してみると、"89 50 4E 47"で始まっていますので、PNGフォーマットで間違いなさそうです。
This challenge does not have a specific flag format.
ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEFPNGファイルシグネチャは必ず"89 50 4E 47 0D 0A 1A 0A"ですので間違いありません。IHDRチャンクを見てみましょう。
------------------------------------------------------------------------------
00000000 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 臼NG........IHDR
00000010 00 00 02 9A 00 00 02 07 08 06 00 00 00 35 46 89 .............5F.
00000020 13 00 00 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61 .....gAMA..ア..��
オフセット | サイズ | 名称 | 内容 |
---|---|---|---|
0x0000 | 4 | Length | 00 00 00 0D |
0x0004 | 4 | Chunk Type | 49 48 44 52(IHDR) |
0x0008 | 4 | 画像の幅 | 00 00 02 9A(666) |
0x000C | 4 | 画像の高さ | 00 00 02 07(519) |
0x0010 | 1 | ビット深度 | 08 |
0x0011 | 1 | カラータイプ | 06 |
0x0012 | 1 | 圧縮手法 | 00 |
0x0013 | 1 | フィルタ手法 | 00 |
0x0014 | 1 | インターレース手法 | 00 |
0x0015 | 4 | CRC | 35 46 89 13 |
# coding: UTF-8これで計算してみると、CRCは"3F F4 FC 62"になります。CRCが誤っているようですので、該当箇所を修正して表示してみますが、まだ表示できません。次に怪しいのは画像の幅、高さですかね。
require "zlib"
width, height = 666, 519
depth, color_type = 8, 6
# チャンクのバイト列生成関数
def chunk(type, data)
[data.bytesize, type, data, Zlib.crc32(type + data)].pack("NA4A*N")
end
File.open("test_a.dat", "w") do |io|
io.binmode
io.write chunk("IHDR", [width, height, depth, color_type, 0, 0, 0].pack("NNCCCCC"))
end
画像の幅、高さが合っているかIDATチャンクを展開して確認してみましょう。IDATデータはdeflate圧縮されていますので、次のRubyコードでIDATデータ部分のみ展開して別ファイルに保存します。
# coding: UTF-8PNGのデータは1ラインごとに先頭に圧縮タイプを表すFilter Typeが設定されています。このFilter Typeの間隔を数えれば画像の幅が分かります。
require "zlib"
File.open("m100.png", "r") do |io|
io.binmode
io.seek(0x73, IO::SEEK_SET)
File.open("test_b.dat", "w") do |io2|
io2.binmode
io2.write Zlib::Inflate.inflate(io.read(0xfdf2))
end
end
ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEFFilter Typeについては以下のサイトが分かりやすいです。
------------------------------------------------------------------------------
00000000 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
00000010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ................
http://hoshi-sano.hatenablog.com/entry/2013/08/18/113434
Filter Typeを調べると、アドレス0000、0a71(=2673)、14e2(=5346)、・・・の位置に出現します。ということで、画像の幅は2672(=0a70)バイトであることが分かります。画像データサイズが1472823バイトなので、画像の高さは1472823÷2673=551(=0227)バイトになります。
画像の幅、高さが分かりましたので、IHDRチャンクを修復してみましょう。
1バイトを画像の1ピクセルと仮定して、ビット深度8ビット、カラータイプ0(グレースケール)でIHDRチャンクを生成します。
ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF赤字の箇所が修正した箇所になります。
------------------------------------------------------------------------------
00000000 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 臼NG........IHDR
00000010 00 00 0A 70 00 00 02 27 08 00 00 00 00 87 30 DA ...p...'......0レ
00000020 75 00 00 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61 u....gAMA..ア..��
修正した画像ファイルを表示すると、下図のとおり表示されました。
したがって、フラグは、
Flag:s1z3_d03s_ma773r_babyです。