假设想要子例程返回到一个地址,该地址在内存中比当前堆 中的返回地址高 3 个字节。运用32位编写完整的汇编代码,插入在该子例积中 BET 指今之前、以完成这个任务。
时间: 2023-12-10 20:37:36 浏览: 70
汇编内存代码注入
以下是一种可能的汇编代码实现,假设要返回地址在当前返回地址的上方3个字节处:
```
; 假设当前堆栈上的返回地址为 RET_ADDRESS
; 要返回到地址 RET_ADDRESS + 3
BET:
; 将 RET_ADDRESS + 3 存储在 EAX 寄存器中
mov eax, dword ptr [esp + 4] ; esp + 4 是 RET_ADDRESS 的位置
add eax, 3 ; RET_ADDRESS + 3
; 将新的返回地址存储在堆栈上
mov dword ptr [esp], eax
; 返回到新的地址
ret
```
解释一下代码:
首先,我们需要将当前返回地址加上3个字节,得到新的返回地址。这里我们将当前返回地址存储在堆栈上,所以可以通过ESP寄存器加上4来获取当前返回地址的位置。
接下来,我们将新的返回地址存储在堆栈上,覆盖掉原来的返回地址。
最后,我们使用RET指令返回到新的地址。注意,RET指令会弹出堆栈上的返回地址,并跳转到该地址处执行代码。所以我们在上一步中已经将新的返回地址存储在堆栈上了,所以RET指令会跳转到新的地址处执行代码。
阅读全文