DEFCON CTF 2014

わからないことだらけだ。

■バイナリ解析
どうやら、バイナリを逆コンパイルすることが必要なようだ。以下で勉強しよう。
古のテクニックを見せようと思ったら最近の技術の前にあっさり敗北した話 | ありえるえりあ

ポイントは、

コードもデータもメモリ上では単なるバイト列
コードと同じバイト列をメモリ領域に書き込んで、そこにジャンプすれば関数を実行できる

elf形式の勉強
Linux on Power Systems JPN
まずは、ELF バイナリーに含まれるセグメントやセクションの情報。

.text セグメントは、プログラムの実行コードが含まれています。
– .rodata は、読み込み専用のデータ(定数値など)が含まれています。
– .data は、変更可能な初期化済みデータ(プログラム内で初期値が指定されている変数など)が含まれています。
– .bss は、変更可能な未初期化データ(プログラム内で初期値が指定されていない変数など)が含まれています。(メモリー
上の値は、最初は、全てゼロに初期化されます。)

readelf -S shitsco_c8b1aa31679e945ee64bde1bdb19d035

次に、セグメント情報
readelf -l shitsco_c8b1aa31679e945ee64bde1bdb19d035


セクションについて
Assembly Programming on ARM Linux(07)

セクションとは、プログラム本体やプログラム中で使用する定数、文字列、変数 に必要な性質に応じて区別して管理するためにあります。 書き換え不可能な領域(text)、書き換え可能な領域(data)、実行前に値を設定する 必要のない領域(bss)があります。複数のソースファイルを別々にアセンブルした 後に、まとめてリンカ(ld)でリンクすると同じセクションごとにまとめた形で 実行ファイルが生成されます。

text セクション (.text) にはプログラム本体や初期化されて変更する必要の ないデータを置きます。

data セクション (.data) は初期化が必要なデータを置きます。data セクションの データは実行時に書き換えることができます。

bss セクションは実行時にメモリを割り当てる領域です。実行開始時に 定義済みの値を持つ必要のないメモリ領域に使用します。bss セクションでは 通常 .byte, .long などのシンボル定義や、配列用などのまとまった領域を確保する .skip だけを使います。実行開始時にはすべて 0 に初期化されています。

ARMでは1命令の長さの制限(常に4バイト)のために簡単に任意のメモリアドレスを ラベルで参照することができません。文字列などのデータを使用するコードの 近くにデータを置くことが必要になる場合がよくあるため、書き換える必要がない データを積極的に text セクションに置くことになります。プログラムとデータを 分離したセグメントに置くことの多い i386 とは文化が違います。ARMでは命令長が 一定のため、逆アセンブルした場合のズレをあまり気にする必要がないと思います。

gccコマンド
gcc

objdumpコマンド
objdump - コマンド (プログラム) の説明 - Linux コマンド集 一覧表
基本は、「objdump -S -d foo.o」のように使う


64bit環境で32bit実行ファイルを実行
linux/tips/実行ファイルが確かに有るのに、無いって実行してくれない - 豚吐露@wiki - アットウィキ

■ネットワーク関連
ncから全ては始まる。
Netcat - Wikipedia