Forensics 100

DEFCON19 CTF quals終了 - てっじーの丸出し
今日というか昨日の朝方まで行われていたDEFCON 19のCTF予選で、
日本のチームsutegoma2が2位になり本戦出場がほぼ確実になったそうです。

twitterのTLがそんな話題で盛り上がっており、
実際の問題やファイルがアップされていたこともあって
無茶は承知で僕も挑戦してみました。

問題はForensics 100に決定。
http://n.pentest.jp/?p=1018

ファイルを落としてきてとりあえずバイナリエディタで開いてみると
PNGシグネチャっぽいものが見えたので、fileコマンドで調べてみるとやっぱりPNGっぽい。

f100_fb8149b6f6eaef95d38.txt: PNG image data, 19025 x 1, 8-bit/color RGBA, non-interlaced

画像を開いてみると恐ろしく横長。
プロパティを見てみると19025 x 1ピクセル

で、どうしよう・・・。
ここから1時間ほどバイナリエディタで眺めてみたり、
画像と希望のないニラメッコしたりしました・・・。

で、あっさりあきらめて問題ファイルをいただいたサイトをカンニングすることに。
http://n.pentest.jp/?p=1018
初期の方針は間違っておらず、PNGファイルであってはいた。

拡大して色々なところを眺めます。
すると何やら色々な縦線に紛れて
青い線が等間隔(450ごと)に存在することを発見。

ええええ。どうやったらこんなの気づくんだ・・・。
とほぼ答えのヒントをもらい、続きをやってみることにしました。
450ごとに区切るスクリプトperlで作成。

#!/usr/bin/perl
use strict;
use warnings;
use Imager;
use POSIX qw/ceil/;

my $width = 450;
my $img = Imager->new;
$img->read(file =>'f100.png') or die;
my $size = $img->getheight() * $img->getwidth();

my $newimg = Imager->new(xsize => $width, ysize => ceil($size/$width) );

for( my $i=0; my $p=$img->getpixel(x => $i, y => 0); $i++ ){
	$newimg->setpixel(x => $i % $width, y => int($i / $width), color => $p);
}

$newimg->write(file =>"test.png") or die;

で、出来たファイルが↓。

うーん、これで100かぁ。まったく青線になんて気づかなかったよ・・・。
難しいもんだ。
そのうちまた別な問題もチャレンジしてみたいと思います。