【问题标题】:x86 Assembly two jump instructions with the same targetx86汇编两个具有相同目标的跳转指令
【发布时间】:2018-01-28 06:41:06
【问题描述】:

我尝试从 Michael Sikorski 的“实用恶意软件分析”一书中理解一个示例。有一个我不理解的反反汇编技术的例子。它说一种常见的技术是创建两个条件指令,即如果为零则跳转(JZ)和如果不是零则跳转(JNZ),它们一起考虑实际上只是一个无条件指令(这对我来说很清楚)。以下是反汇编程序创建的两种可能结果的图形。

以下引用参考图1

在本例中,紧跟在两个条件跳转指令之后的指令似乎是在 (call) 处的调用指令,从字节 0xE8 开始。然而,情况并非如此,因为两个条件跳转指令实际上都指向 0xE8 字节之外的 1 个字节

这应该是什么意思,为什么跳转位置是 loc_4011C4+1(+1 来自哪里)?在图2 中是 loc_4011C5?谁能提供更详细的解释?

【问题讨论】:

  • 跳转目标是调用指令内的1个字节。为什么?因为这就是程序员编写它的方式,大概是出于混淆目的。图 2 显示了将要执行的实际指令。 C4+1=C5

标签: assembly x86


【解决方案1】:

汇编代码编译的结果是一段本机代码,更具体地说是一个字节序列,其中该序列的不同部分对应于来自原始汇编的指令。 Intel x86 处理器有一个所谓的 CISC 指令集,这基本上意味着以字节为单位的指令长度可以从 1 到大约 12 不等,这还没有考虑到现在可用的指令集扩展。所提出的技术利用了这一事实。

关键是要误导那些头脑中有潜在恶作剧的人。第二个示例的代码(带有pop eaxretn)是我们想要执行的代码以及将要执行的代码。 然而,因为我们在pop eax指令前面插入了一个假字节,反汇编代码会在不注意的情况下看起来好像在内存中的某个位置有一个call,因为大多数不太聪明的反汇编程序会自动假设机器二进制代码中没有空格。

这种技术并非万无一失。更复杂的反汇编程序将揭示作者的真实意图。还要注意,如果试图闯入代码的人是在调试环境中运行它,那么这种技术将再次毫无用处。

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2015-06-29
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多