【问题标题】:How to pass arguments in push+ret method?如何在 push+ret 方法中传递参数?
【发布时间】:2017-04-16 18:31:17
【问题描述】:

如果我使用call

push b
push a
call address

有效,但使用 call 让我对地址感到困惑。
所以我想像这样使用push+ret 方法:

push b
push a
push address
ret

但这一次,传递参数似乎无法正常工作。
如何用这种方法传递地址?

【问题讨论】:

  • 我不太明白您为什么要这样做,但如果是这样,您还需要手动推送返回地址,否则被调用者将尝试返回到 a。类似于push return_address 的内容,紧接在push address 之前,以及您希望继续执行的任何位置的return_address: 标签。
  • 是什么让您认为参数在堆栈上不可用?你没有为你的信仰提供任何理由。此外,我们真的应该有一个关闭选项,“OP 正试图以错误的方式做某事。”

标签: assembly call


【解决方案1】:
call address

这个近距离呼叫指令做了两件事:

  • 它将返回地址放入堆栈,即直接在call address 指令本身之后的内存地址。
  • 它通过更改EIP 寄存器将控制权转移到地址处的代码。

您的替换代码执行后一种操作。

要更正代码,请手动推送退货地址:

    push b
    push a
    push Back
    push address
    ret
Back:

这一次你会看到传递参数的效果是一样的。


使用这种替代方法,完全可以将 Back: 标签放置在您喜欢的任何位置以及有意义的位置!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2020-05-21
    • 2015-01-29
    相关资源
    最近更新 更多