FC2ブログ

なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

C14

C14はリバースエンジニアリングの応用編。とくにブラックボックステストが中心

このチャプタのキーワードは

fuzzing
デバッガ
Flow Analysys Tool
Memory Monitering Tool

などがある。

fuzzingは解析対象の実行ファイルに対して、さまざまな入力を与えることにより、バグを探すことができる。
FlowAnalysysToolは制御とデータの流れを監視し理解するのに役立つ
MemoryMoniteringToolは実行中のプログラムのメモリの様子を観察し以下のようなエラーを見つけることができる。

・初期化されていないメモリへのアクセス
・確保している領域外に対するアクセス
・メモリリーク
・2回以上のfree

このツールにはx86のLinuxで動作するvalgridというオープンソースソフトがあるらしい。

C12

Passive Analysis

ソースコードやバイナリの解析方法について記述されている。
ソースコードはそのまま人の手で解析することもできるが、バイナリファイルは人の手だけではとても解析することができない。そこで逆コンパイルすることで、ソースコードあるいはアセンブリ言語に戻し解析をおこなう。ただし一般的にコンパイル、アセンブルは不可逆操作なので、逆コンパイルしても完全に元のソースコードに戻るわけではなく、変数名や関数名が損失する。一方JavaやPythonなどの中間言語を生成してインタプリタで実行するプログラムでは中間言語で記述されてファイルに変数名やクラス名、関数名が残されており、人が読めるレベルに復元できる場合がある。

このチャプタの後半と次のチャプタC13でIDA Proというバイナリ実行ファイルを解析するツール、おそらく有料、の特徴や使用の仕方の説明なので読み飛ばした。なので次回はC14のメモから始める。

C11の続き3

C11の最後はNIPrintServerの脆弱性を実際にVNWare上でサーバをたてて攻撃してみるという実験が紹介されていた。

それと、脆弱性攻撃の流れが書かれていた。

・eipを制御する
・オフセットの計算
・攻撃内容の決定
・exploit sandwichを作製
・exploitの動作テスト
・(必要ならば)exploitのデバッグ

C11の続き2

いよいよ。windowsでexploitを行なう。

本によると実験を行なう際にperlを用いているが、とりあえずできるところまではpythonで書いてみようと思ったので、perlを用いているところは代わりにpythonを使った。

まずは
sc[]= //SHLLCODE;
main()
{
int *ret;
ret = (int *)&ret + 2;
(*ret)=(int)sc;
}

このプログラムでシェルコードを動かす実験を行なった。
このときに使うシェルコードはmetasploitがweb上で公開しているシェルコード作製ツールをweb越しに生成するらしいのだが、指定されたページにアクセスしてもなぜかつながらなかったので、今回はUbuntuにインストールしたmetasploitからシェルコード化ツールと暗号化ツールをつかってwindowsで電卓を起動させるシェルコードを生成し、それを先のプログラムにコピペした。

そしてプログラムをコンパイルして実行すると電卓が起動した。ちなみに、本の通りにweb上でシェルコードを生成したのを利用すると電卓がフリーズするらしい。原因はexit()と例外の設定の関係らしい。今回ubuntuのmetasploitで作製したシェルコードではフリーズしなかったがその原因は、シェルコード作製に使ったツールが気を利かせてその対策をした上でのコードを生成したからだと推測される。

次の実験ではあらかじめ作っておいたバッファオーバーフローの脆弱性を持つプログラムに対して先のシェルコードを挿入し電卓を起動しようと試みる。

と、その前に、インラインアセンブラを用いたESPの値を表示するだけのプログラムを作りそれを用いてESPを確認した(疑問:espの値なんてスタックに応じて頻繁に変化するものなのにこんないい加減なのでいいものか?)

実験に用いた脆弱性のあるプログラムは400個の要素を持つchar型配列を用いているので、esp+400がPUSHされているebpのアドレス、esp+404がPUSHされているeipのアドレスが格納されていると考えられるので本を参考にして、
24バイトのNOPと226バイトのシェルコード、さらに154バイトのNOPと4バイトの書き換える戻りアドレスから構成されるpayloadをpythonによって文字列に格納し、それをos.spawnvの引数に利用して脆弱性のあるプログラムを呼び出した。が、うまくいかなかった。pythonいわくpayloadは文字列じゃないので引数に使えないとかいうことらしい。なぜだ!?

機械があればperlでやり直してみたいと思う。今回は疲れたのでここまで。

続く。

C11の続き

C11の続き。

前回のデバッグ作業のチュートリアルの続き。
cdbのコマンドで前回挙げなかったものに
uとuf
がある。uは対象関数を少し逆アセンブルしufは対象関数はすべて逆アセンブルする。

cdbのチュートリアルが終わると次はOllyDbgのチュートリアル。
スタックやコードの内容が表示されて使いやすいが、ユーザ空間でしか動作しないから注意しろとこの本は促している。

きりが良いので今回はここまで。次回はwindowsで実際に動作するpayloadを作製する。

続く。

Paging Navigation

Navigations, etc.