gpt4 book ai didi

assembly - 检测IP之前的调用指令

转载 作者:行者123 更新时间:2023-12-02 21:57:33 25 4
gpt4 key购买 nike

在 x86 上,调用后压入堆栈的地址指向调用指令之后的位置。该指令在 x86 机器上可以是可变长度的。有没有办法检测使用了哪种调用?

例如,间接调用 *(%eax) 是 FF 10,但这也可能是直接调用 0x10FF10FF 的一部分。即

12: ff 10                   call   *(%eax)
14: e8 fb 10 ff 10 call 10ff1114 <main+0x10ff1114>

例如如果我找到 FF 10,则检查 E8 之前的 3 个字节是否足够?还有哪些我没有想到的隐藏陷阱?

最佳答案

由于您掌握的信息比平时稍多,因此可能性稍小一些。但我将准确地展示即使有额外的信息它仍然是不可能的。

额外的信息来自于了解它跳转到的位置以及返回地址。如果差异与返回地址之前的双字不匹配,则这不是直接调用。所以你可以相对容易地找到这一点,而不必搞乱向后解码(这通常是不可能的,只有运气和启发式以及不是专门设计来击败它的代码,即使如此,跳跃也可能发生从任何地方任何地方)。

但是,代码可能是这样的:

  push returnaddr
mov eax, calladdr
jmp eax ;or whatever way you like, showing a silly jump through reg for no reason
...
call calladdr
returnaddr:

现在无论如何它都会以一种你无法检测到的方式匹配。

因此,您唯一可以确定的是,这是否绝对是直接调用之外的其他内容。您无法确定使用了任何特定方式 - 显然可以替换上面代码片段中的call calladdr,使其看起来像任何所需的模式。

关于assembly - 检测IP之前的调用指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12866607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com