Assembly 返回地址操作不起作用
因此,我的目标是更改返回地址以跳过一个字节0xE8。 调用此函数后,返回地址位于堆栈顶部,对吗?因此,弹出、添加1并按下值应该可以完成这项工作。 至少使用OllyDbg乍一看是这样的,但事实上,剩下的代码——只是打印一个字符串——无法工作Assembly 返回地址操作不起作用,assembly,stack,Assembly,Stack,因此,我的目标是更改返回地址以跳过一个字节0xE8。 调用此函数后,返回地址位于堆栈顶部,对吗?因此,弹出、添加1并按下值应该可以完成这项工作。 至少使用OllyDbg乍一看是这样的,但事实上,剩下的代码——只是打印一个字符串——无法工作 call manipulate db 0xE8 push NULL push dummy push msg.len push msg push eax call WriteConsoleA push
call manipulate
db 0xE8
push NULL
push dummy
push msg.len
push msg
push eax
call WriteConsoleA
push NULL
call ExitProcess
manipulate:
pop eax
add eax, 1
push eax
ret
那么为什么这不起作用呢?有更好的方法吗?常见的例程是在过程调用后将
BP寄存器的值存储在堆栈中。然后将BP
设置为堆栈顶部
。之后,您可以使用BP
访问堆栈中的元素
nameOfProc proc
push BP
mov BP,SP
堆栈比如下所示:
ret address |
BP register | <-- BP / SP
mov eax, [BP+4]
add eax, 1
mov [BP+4], eax
在过程结束后标记要返回的位置也可以,如
returnHere: some code
然后你就可以简单地做到这一点:
mov [BP+4], offset returnHere
最后,您必须像这样弹出存储的BP寄存器
mov SP, BP
pop BP
ret ;if you use some arguments for procedure - you push them to stack before call than use ret numberOfBytesOfAllArguments
nameOfProc proc
我也不明白操纵:
-这不是过程,但你用调用操纵调用操纵会在eax
中重击值,然后将其用作writeconolea
的参数,你不需要将代码标记为调用它的过程。任何标签或地址都可以调用。此外,op不使用过程宏,因此他在操作中没有任何bp
更改
感谢您在回答该问题时付出的努力!我相信会的help@Micha瓦伦恰克是的,你是对的,是我的错。不管怎样,我希望它会有所帮助。你的代码和想法似乎是正确的。也许你的打印通话中断了?:)尝试不调用操作