3

system()libc エクスプロイトへの復帰を作成しようとしていますが、呼び出しの引数をスタックのどこに配置すればよいかわかりません。

脆弱な機能は

void func(char *str)
{
     char buffer[12];
     strcpy(buffer,str);
}

この関数のスタックは次のようになります。

 -----------
 str
 -----------
 return address
 -----------
 previous frame pointer
 -----------
 buffer
 -----------

戻りアドレスをsystem()呼び出しのアドレスで上書きする必要があることは理解していますが、その引数のアドレスをどこに配置すればよいのでしょうか?またその理由は?

ありがとう。

4

1 に答える 1

0

引数へのポインターは、戻りアドレスのすぐ上にある必要があります。つまり、上書き後、スタックは次のようになります。

-----------
shellcode: /bin/whatever ...
...
...
...
\0
-----------
&shellcode    <-- str is here
-----------
&system       <-- return address is here
-----------
previous frame pointer <--- don't corrupt this
-----------
padding       <-- buffer

これは、 (前のフレーム ポインターが破損するのを避けるために)%esp到達したときに何があるかを知る必要があることを意味することに注意してください。strcpyまた、ポインターにゼロバイトを含めることはできません。

于 2011-10-14T20:00:47.643 に答える