返回地址操作不起作用

时间:2015-05-13 10:27:44

标签: assembly stack

所以我的目标是更改返回地址以跳过一个字节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

那为什么这不起作用?有更好的方法吗?

2 个答案:

答案 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来称呼它。