所以我的目标是更改返回地址以跳过一个字节0xE8。 调用此函数后,返回地址位于堆栈的顶部,对吧?所以弹出,添加1并推动值应该完成工作。 至少它看起来像乍一看使用OllyDbg,但实际上其余的代码 - 只是打印一个字符串 - 不会工作。
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
那为什么这不起作用?有更好的方法吗?
答案 0 :(得分:2)
您对manipulate
的调用会使eax
内的值瘫痪,然后将其用作WriteConsoleA
的参数。
答案 1 :(得分:0)
常用例程是在过程调用后将BP register
的值存储在堆栈中。然后将BP
设置为top of stack
。之后,您可以使用BP
访问堆栈中的元素。
nameOfProc proc
push BP
mov BP,SP
堆栈比看起来像这样:
ret address |
BP register | <-- BP / SP
然后您可以使用BP register
访问ret地址,如下所示:
mov eax, [BP+4]
add eax, 1
mov [BP+4], eax
在程序结束后标记要返回的地方也很好,如
returnHere: some code
而且你可以简单地这样做:
mov [BP+4], offset returnHere
最后你必须像这样弹出stored BP register
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
我也不理解manipulate:
- 这不是程序,而是用call manipulate
来称呼它。