1

explore_notesearch プログラムについて質問があります。

このプログラムは、system() 関数で最終的に呼び出すコマンド文字列を作成するためにのみ使用され、バッファ オーバーフローの脆弱性を含む notesearch プログラムを悪用します。commandstr は次のようになります: ./notesearch Nop-block|shellcode|repeated ret (nop ブロックでジャンプします)。

実際の質問: ret-address は、exploit_notesearch プログラムで次の行によって計算されます。

ret = (unsigned int) &i-offset;

それではなぜ、exploit_notesearchプログラムのメイン スタックフレームのかなり下にあるi 変数のアドレスを使用して、 notesearchプログラム自体のオーバーフロー バッファに保存されるret アドレスを計算できるのでしょうか。異なる stackframeであり、nop ブロック (同じバッファーにある) にアドレスを含める必要があります。

4

2 に答える 2

3

これは、notesearch プログラム自体のオーバーフロー バッファに保存されるため、まったく異なるスタックフレームに保存されます。

システムが仮想メモリを使用している限りsystem()、脆弱なプログラムのために別のプロセスが作成され、スタックのランダム化がないと仮定すると、両方のプロセスは、機能が開始されるときにesp(および) の値がほぼ同じになります。エクスプロイトは、攻撃されたマシンでコンパイルされました (つまり、脆弱なノートサーチを使用)。 変数のアドレスは、フレームのベースがどこにあるかを示すために選択されました。代わりにこれを使用できます。offsetmain()
i

unsigned long sp(void)         // This is just a little function
{ __asm__("movl %esp, %eax");} // used to return the stack pointer

int main(){

esp = sp(); 
ret = esp - offset; 

//the rest part of main()

}

変数iは から比較的一定の距離にあるため、 の代わりにesp使用できますが、それほど重要ではありません。&iesp

retシステムが仮想メモリを使用していない場合、おおよその値を取得することははるかに困難です。

于 2013-08-10T01:04:46.417 に答える
0

スタックは、ファーストインラストアウトアプローチのように割り当てられます。i変数の場所は上部のどこかにあり、それが0x200であり、リターンアドレスが下位アドレス0x180にあると仮定します。そのため、リターンアドレスを配置する場所を決定し、まだスペースを残さないようにします。シェルコード、攻撃者は違いを取得する必要があります:0x200-0x180 = 0x80(128)、それで彼はそれを次のように分解します、++、リターンアドレスは4バイトなので、到達する前に残っているのは48バイトだけですセグメンテーション。それが計算方法であり、私がおおよその基準点を与える場所です。

于 2012-11-09T23:57:58.807 に答える