Перезаписываем ли мы EIP (обратный адрес) кодом операции или адресом памяти?

#assembly #x86 #stack-overflow #shellcode

#сборка #x86 #переполнение стека #шеллкод

Вопрос:

 char shellcode[] =        "xebx2ax5ex89x76x08xc6x46x07x00xc7x46x0cx00x00x00"        "x00xb8x0bx00x00x00x89xf3x8dx4ex08x8dx56x0cxcdx80"        "xb8x01x00x00x00xbbx00x00x00x00xcdx80xe8xd1xffxff"        "xffx2fx62x69x6ex2fx73x68x00x89xecx5dxc3";

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

насколько мне известно, shellcode[] это шестнадцатеричный код операции для создания оболочки, а последняя строка кода перезаписывает ret кодом операции. Вставляем ли мы код операции или адрес памяти в RET ?

Комментарии:

1. Совсем не ясно, что вы пытаетесь здесь спросить.

2. отредактировано…………………….

3. допущена ошибка, предполагается, что это eip вместо esi

Ответ №1:

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

Ответ №2:

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

Ответ №3:

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