0x01のソースプログラム
Linuxでのgcc -oテストtest.cの缶は、ELFファイルにコンパイル。このソースコード構造でちょうど見て、おそらく脆弱性が何であるかで見ることができ、実際には非常に簡単です。
書式#include <stdio.hに>
構造体学生{
文字名[8]。
int型の誕生。
}。メイン(ボイド){int型
はsetbuf(STDIN、0);
setbuf(STDOUT、0);
setbuf(stderrを、0);
学生の学生をストラクト。
printfは( "何\ 'あなたの誕生をS \ nは?");
scanf関数( "%のD"、&student.birth)。
しばらく(getchar関数()= '\ n'は!)。
もし(student.birth == 1926){
のprintf( "あなたは1926年生まれ\ nはできません!");
0を返します。
}
のprintf( "何\ 'あなたの名前はS \ nは?");
(student.name)を取得します。
printf( "あなたは生まれている%D \ n"は、student.birth)。
もし(student.birth == 1926){
のprintf( "あなたは旗を持つものとします。\ n");
システム(「CATフラグ」)。
printf( "ここにあなたの速度1秒\ N。");
}
0を返します。
}
0x02の基礎解析
*通常の操作手順上記の入力で、底がハッカー正式入力されていない、入力データが不規則な、異常なデータを戻すときにことは明らかである、おそらくこれは、スタックオーバーフローの脆弱性であると結論付けることができます。
*私たちは、プログラムのデバッグ、ソースコードではありませんので、我々はまずあり、その後オフエントリアドレスを見つけ、またはメインアドレスを見つけ、そして。
*以下の図のブレークポイントのアドレスです。rは、プログラムを実行している、プレスNIは、ステップ実行によってステップです
*以下は、主な機能の入り口、またはどのくらいのソースコードが存在しない場合には、このプログラムに精通してデバッグをあなたの場所を見つけることができた経験に基づいており、プログラムのソースコードのこの種については逆の考え方です。Sは、プログラムにプレスに呼び出します。
いくつかのデバッグを描くことができた後*、この場所は、最初に入力されます。
*これは、第二局部入力され、その後、Aの束を入力してください
*この時点で、我々は0x4008abこの場所を参照してください、より公正で、0x786比較は1926年であり、これは正確にソースコードのマッチングで、我々はおそらくここでジャンプの最も重要なポイントを推測します。
*我々はビットデータスタック上記参照この点、X / 20gxで、xはメモリの図であり、20、Gは、Xはヘキサで、8バイトです。我々は、このアドレスのデータが61、ASCIIコードだけ進値である参照します。
......図を言いません。
0x786にEAXの値。
ステップバイステップのデバッグは、あなたが旗を持って証明されたように旗が、限り、ここに入力することができ、間違っていない証明しなければならないここにあり。
*手動でPythonプログラムで書かれたエクスプロイト。Pwntoolsは、このモジュールをインストールする必要があります。
sudoのピップはpwntoolsをインストール
0x03のテスト結果:
0x04の概要:
这段程序并不难,尤其还有源码,再加上struct结构体,完全可以看出栈溢出漏洞在哪。虽然有源码,但是我还是建议多多动手调试,从反汇编逆推出源码大概是怎样的,这样非常有助于新手成为逆向工程师或者有关的工程师。这段python也是需要多百度,百度有非常多的例子,也建议不会的多百度,直到找到答案为止。