NASM пу sh до рет - PullRequest
       6

NASM пу sh до рет

1 голос
/ 25 марта 2020

Когда происходит call, я понимаю, что адрес вызывающей стороны помещается в стек, а когда выполняется ret, он переходит на извлеченное значение из стека.

Что произойдет, если я наберу sh значение и забуду его вставить? Не будет ли ret просто pop, что это будет адрес возврата из стека, и будет ли он ошибочно принят любым значением, которое на самом деле находится на вершине стека? Например:

Function:
    mov ax, "A"
    push ax
    ret

call Function

Кроме того, мне интересно то же самое о pusha и popa. Если I push значение после pusha, то теперь popa использует это значение, когда оно выталкивает столько регистров, сколько использует, оставляя оригинальный первый регистр в стеке и восстанавливая каждый регистр в значение регистра + 1?

1 Ответ

3 голосов
/ 25 марта 2020

Стек - это просто память, в любом случае он не «напечатан», вы всегда можете извлечь sh один регистр и вставить другой.

ret - это просто pop в ip зарегистрироваться, так что push / ret - неэффективный способ jmp. Нет волшебников c, которые бы соответствовали предыдущим call.

. Вы даже можете изменять данные в стеке, не используя pu sh, просто измените их, используя указатель esp или ebp. И уверен, что вы можете случайно переписать обратный адрес. А заставление вашей программы случайно перезаписать обратный адрес - это хорошо известный метод, используемый вредоносными программами.

...