Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 返回地址操作不起作用_Assembly_Stack - Fatal编程技术网

Assembly 返回地址操作不起作用

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

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

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

常见的例程是在过程调用后将
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瓦伦恰克是的,你是对的,是我的错。不管怎样,我希望它会有所帮助。你的代码和想法似乎是正确的。也许你的打印通话中断了?:)尝试不调用
操作