トップ «前の日記(2010-03-16) 最新 編集

yoggy's diary

〜せかいのすみっこから〜


2010-03-20

CODEGATE2010 CTF Level 4の解き方メモ

以下のURLに模範解答が載っていたので、それを読んで理解した内容をまとめています。

問題文は次の通りで、サーバ上でListenしているプログラムにexploitを打ち込んで、サーバ上に置いてあるkeyが格納されたファイルを取得する問題でした。

credentials: ctf4.codegate.org 9000

BINARY FILE: http://ctf.codegate.org/files____/easy

ダウンロード可能なファイルはLinuxで実行可能なするELF 32bitバイナリです。

$ file easy
easy: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses  shared libs), for GNU/Linux 2.6.15, not stripped

実行すると標準入力から文字入力を求められます。問題サーバではinetd経由などで動作していると思われます。

$ ./easy
Input: a

Thanks. Goodbye

入力される文字が長いとプログラムがsegmentation faultで落ちるいつものパターンの問題なのですが、 少しshellcode実行が難しい環境での問題でした。

サーバ環境について

  • ターゲットのサーバ上ではASLR(Address Space Layout Randomization)が有効。
  • 実行するたびにプロセス内のスタックなどのアドレスが変化する。
  • 単純にリターンアドレス書き換えだけではshellcodeへジャンプできない。
  • 安定してshellcodeへジャンプさせるための工夫が必要。

memcpy()を使用している関数内でstack overflowが発生している

  • 問題のある関数の最後でmemcpy()が呼び出されている
  • memcpy(void *dst, cosnt void *src, size_t size)の戻り値はdstのポインタ。つまりmemcpy実行直後は入力した内容が格納されているバッファの先頭アドレスがeaxに格納されている。
  • 問題のある関数を抜ける際のeaxレジスタは、入力バッファの先頭を指している

攻略ポイントは、call eaxを利用した安定したshellcodeへのジャンプ。

  • msfelfscanを使ってeasyのバイナリ中にあるcall eaxを探す
$ msfelfscan -j eax ./easy
[./easy]
0x080484df call eax
0x0804860b call eax

shellcode実行までの流れ

  • (1) リターンアドレスを書き換えて、call eaxが存在しているアドレスへジャンプ
  • (2) call eaxが実行され、バッファの先頭へジャンプ
  • (3) nop slide area 1へ着地して、nop(何もしない命令)が実行される
  • (4) nop slide area 1の最後にjmp short 0x12を配置。jmp shortでリターンアドレスがある部分を迂回してnop slide area 2へジャンプ
  • (5) nop slide area 2へ着地。nopが実行されその終端にあるshellcodeが実行される

4446529261_3ac511d50a.jpg


トップ «前の日記(2010-03-16) 最新 編集

2003|01|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|
2010|01|02|03|