CTF Writeup SECCON 2015

結果&感想

今回、チームsky3は、某チームに合流してSECCON2015に参加しました。
楽しかったです!!
ある程度人数がいると、閃きと気づきの総数が増えるので、単独では解けなかった問題が、チームの皆さんの手により、あれよあれよという間に解かれていきました。

あと相変わらず、メンバーの c@tさん, リリりん♪さんは、スゴかったです。

チーム名公表していいかわからないので、とりあえず伏せておきますが、ランキングは出場チーム上位3%に入っていることを申し添えておきます。

いちおう300点分獲得できたので、その問題について、writeup書きました。
チームメンバが解いた問題のwriteupも、了解が取れれば合わせて公開するやも。

Individual Elebin

問題

すべてのELFファイルを実行せよ
Individual_Elebin.zip

中身は、1.bin … 11.bin が入っている。


とりあえず定番のfileコマンド

$ file ./*
./1.bin:  ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), statically linked, stripped
./10.bin: ELF 32-bit LSB executable, ARM, version 1, statically linked, stripped
./11.bin: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), statically linked, stripped
./2.bin:  ELF 32-bit MSB executable, MC68HC11, version 1 (SYSV), statically linked, stripped
./3.bin:  ELF 32-bit LSB executable, NEC v850, version 1 (SYSV), statically linked, stripped
./4.bin:  ELF 32-bit MSB executable, Renesas M32R, version 1 (SYSV), statically linked, stripped
./5.bin:  ELF 64-bit MSB executable, Renesas SH, version 1 (SYSV), statically linked, stripped
./6.bin:  ELF 32-bit MSB executable, SPARC, version 1 (SYSV), statically linked, stripped
./7.bin:  ELF 32-bit LSB executable, Motorola RCE, version 1 (SYSV), statically linked, stripped
./8.bin:  ELF 32-bit LSB executable, Axis cris, version 1 (SYSV), statically linked, stripped
./9.bin:  ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, stripped

どう見ても、CPUアーキテクチャ別のELFファイルです。本当にありがとうございました。

・・・がんばって実行するぞ!!

実行するための方法

以下の4つの方法で実行します。

そのまま普通に実行

1.bin だけは x86 なのでそのまま実行できますね。

$ ./1.bin 
SECCON{AaA

クロスコンパイル環境 gdb を使う

自分のPCのCPUアーキテクチャ以外は、クロスコンパイル環境を使って実行するのがよいでしょう。
ただし、1からコンパイルを始めると競技時間内に終わりません。
予め、コンパイル済みの環境を準備しておくしかありません。

そこで!!!1

kozosの坂井さんの力をお借りします。

cross-gcc4-20130826.zip をインストール済みのCentOS6.5イメージ (OVAフォーマット)
FreeBSDのVirtualBox用イメージを,OVAフォーマットにしたもの

ここの仮想環境を使わせて頂きます。
ちなみに坂井さんの著作はバイナリアン必見の良書揃いです!

ももいろテクノロジー 各種アーキテクチャのクロスコンパイラ環境を構築するも大変参考になります。

さて、坂井さんのCentOS6.5を起動して、クロスコンパイルの環境を確認してみます。

$ pwd
/usr/local/cross-gcc4/bin
$ ls *gdb
arm-elf-gdb   cris-elf-gdb   m32c-elf-gdb        mips16-elf-gdb   powerpc-elf-gdb  sh64-elf-gdb   v850-elf-gdb
avr-elf-gdb   frv-elf-gdb    m32r-elf-gdb        mips-elf-gdb     rl78-elf-gdb     sh-elf-gdb
bfin-elf-gdb  h8300-elf-gdb  microblaze-elf-gdb  mn10300-elf-gdb  rx-elf-gdb       sparc-elf-gdb

いろんなCPU用に用意されているのがわかります。

CPUアーキテクチャの違うバイナリでも、staticリンクのバイナリであれば、各CPUアーキテクチャ用のgdbで実行できます。

gdb起動後は、

target sim
load 
run

の順に入力して実行します。

$ ./arm-elf-gdb /tmp/Individual_Elebin/10.bin
GNU gdb (GDB) 7.5.1
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-elf".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /tmp/Individual_Elebin/10.bin...(no debugging symbols found)...done.
(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section .text, size 0x848 vma 0x1400
Loading section .rodata, size 0xe4 vma 0x1c48
Loading section .data, size 0x4 vma 0x2000
Start address 0x1400
Transfer rate: 18816 bits in <1 sec.
(gdb) run
Starting program: /tmp/Individual_Elebin/10.bin 
8a0d28f[Inferior 1 (process 42000) exited normally]
(gdb) quit

ちょっと判りにくいかもしれませんが、8a0d28f が表示されてます。

クロスコンパイル環境 run を使う

ぶっちゃけ、実行だけならgdbより、こっちの方が楽です。

$ pwd
/usr/local/cross-gcc4/bin
$ ls *run
arm-elf-run   cr16-elf-run  h8300-elf-run  microblaze-elf-run  mn10300-elf-run  rx-elf-run    sparc-elf-run
avr-elf-run   cris-elf-run  m32c-elf-run   mips16-elf-run      powerpc-elf-run  sh64-elf-run  v850-elf-run
bfin-elf-run  frv-elf-run   m32r-elf-run   mips-elf-run        rl78-elf-run     sh-elf-run
$ ./v850-elf-run /tmp/Individual_Elebin/3.bin 
i
$ ./m32r-elf-run /tmp/Individual_Elebin/4.bin 
N
$ ./sh64-elf-run /tmp/Individual_Elebin/5.bin 
12345678
$ ./sparc-elf-run /tmp/Individual_Elebin/6.bin 
90abcdef
$ ./cris-elf-run /tmp/Individual_Elebin/8.bin 
AW
$ ./avr-elf-run /tmp/Individual_Elebin/9.bin 
3a5d37a3
$ ./arm-elf-run /tmp/Individual_Elebin/10.bin 
8a0d28f
$ ./mips16-elf-run /tmp/Individual_Elebin/11.bin 
aAq}

2.bin と 7.binが実行できずに残ってしまいましたが、坂井さんが提供してくださっているFreeBSDの方に該当のCPUアーキテクチャのクロスコンパイル環境が入っています。

$ ./m6811-elf-run /tmp/Individual_Elebin/2.bin 
B
$ ./mcore-elf-run /tmp/Individual_Elebin/7.bin 
BDFHJLNP

qemuを使う

qemuを使う方法もあります。
Ubuntu とか Debian とか Kali Linux で、以下実施してqemuインストール

# apt-get install qemu-user-static

/usr/bin 配下に qemu-[CPU arch]-static が出来るので、それを実行する。
例はこんな感じ。cpuのチップセット(?)を指定するのがコツ。

# ./qemu-cris-static -cpu help /tmp/Individual_Elebin/8.bin 
Available CPUs:
  crisv8
  crisv9
  crisv10
  crisv11
  crisv32
# ./qemu-cris-static -cpu crisv8 /tmp/Individual_Elebin/8.bin 
AW

答え

実行結果を全部くっつけるとフラグになります。

 1.bin  SECCON{AaA
 2.bin  B
 3.bin  i
 4.bin  N
 5.bin  12345678
 6.bin  90abcdef
 7.bin  BDFHJLNP
 8.bin  AW
 9.bin  3a5d37a3
10.bin  8a0d28f
11.bin  aAq}

SECCON{AaABiN1234567890abcdefBDFHJLNPAW3a5d37a38a0d28faAq}

Steganography2

問題

ファイルからflagをさがせ.
sunrise.zip

中身は、sunrize.pngという画像


まず、バイナリエディタでゆるーく見てみましょう!

20151210_sunrize1.png

ファイルの終端付近に、様子の変な領域が見えますね。
png画像の終端を表す 00 00 00 00 49 45 4E 44 AE 42 60 82 "IENDョB`" が見えるので、当然この変な領域も画像として出力されていなければいけないはずですが、画像に変な箇所は見られませんでした。綺麗な朝日です。

それで、「あ、実際の画像サイズより小さくなってるんじゃね?」と思いついて調べてみました。
pngの画像サイズは、イメージヘッダ(Image header、IHDR)という場所に書かれています。

参考:イメージヘッダ(Image header、IHDR)
http://www.setsuki.com/hsp/ext/chunk/IHDR.htm

具体的には、"IHDR"という文字が書かれた後4Byteが画像の幅を表し、その更に後の4byteが画像の高さを表しています。

20151210_sunrize2.png

画像の高さを修正したいので、00 00 0F C0 の所の数を適当に増やしてみます。
画像の下部にフラグが出てきました。

20151210_sunrize3.jpg

20151210_sunrize1.png (118 KB) kanata, 12/10/2015 09:00 PM

20151210_sunrize2.png (49.4 KB) kanata, 12/10/2015 09:13 PM

20151210_sunrize3.jpg (148 KB) kanata, 12/10/2015 09:22 PM

Add picture from clipboard (Maximum size: 100 MB)