tkbctf1にikachanとして参加してきました。こういったCTFに参加するのは初めてでしたが、とても楽しめました。
運営の皆様大変お疲れ様でした。
Good Old Days (Challenge 7)
個人的にツボでした。問題文はこちら。
[ADVANCED]
I need the "Message" to continue my game but I forgot the secret command!!!
Can you get the "Message"? I remember that the "Message" was alphanumeric characters.
渡されたファイルの中身はなんとファミコンのROMでした。
% file cb0c3d0f55b9b627b831f4fbbc153846 cb0c3d0f55b9b627b831f4fbbc153846: iNES ROM dump, 2x16k PRG, 1x8k CHR, [Vert.], [SRAM]
キー入力ができるようになっていて、それに対して出力される文字が変化する。
おもむろにデバッガ起動。
ブレークポイントを設定、上方向キーを入力。
上方向キーを入力した場合、0xC9でXORされていますね。すべてのキーで調べたところ、
A: 0x36でXOR B: 0x5CでXOR ↑: 0xC9でXOR ↓: 0xA3でXOR ←: 左ローテート →: 右ローテート
となっていることがわかりました。
$6000-$6007が順番にキーの入力によって変わるみたいですね。
キー入力後:
大体のことは分かったので、ちょろっとスクリプトを書きます。条件として、メッセージは英数字なのである程度の見当はつくはずです。
use strict; use warnings; use utf8; my %control = ( a => sub { $_[0] ^ 0x36 }, b => sub { $_[0] ^ 0x5c }, up => sub { $_[0] ^ 0xc9 }, down => sub { $_[0] ^ 0xa3 }, left => sub { $_[0] << 1 }, right => sub { $_[0] >> 1 }, ); for my $c (0xbe, 0x60, 0xa4, 0xa5, 0x88, 0x64, 0x03, 0x6a) { for my $key (keys %control) { my $output = chr($control{$key}->($c)); if ($output =~ /^[A-Za-z0-9]$/) { print "$key\t: $output\n"; } } print "\n"; }
実行すると、いくつか候補が出てくるのでいい感じに組み合わせると "w0RlD256" がflagだとわかります。