【问题标题】:Understanding x86 r/m32 instruction理解 x86 r/m32 指令
【发布时间】:2017-05-10 04:59:49
【问题描述】:

我有这段 x86 汇编代码:

mov edx, off_984C400
mov eax, [edx+1E0h]
call eax

OpenSecurityTraining-Videos 告诉我,[something] 意味着处理器尝试访问位于 something 位置的内存。
这意味着move 0x984C400 into edx, add 0x1E0 to it and call whatever address there is in memory

我现在的问题是,我只能通过 IDA 进行静态分析,不知道如何找出[0x984C400 + 0x1E0] 的地址。有什么方法可以获取函数的静态地址吗?

【问题讨论】:

  • 标题与正文提出了不同的问题。间接寻址模式有什么不明白的地方? IDA 通常非常适合找到间接目标,如果它没有提出任何建议,那么目标可能取决于程序状态,并且更容易知道它是什么的方法是在调用之前中断。您可以查看对 off_984c400 的所有交叉引用,并希望一些结果对您有所帮助
  • 0x1E0 是 480... 这与 off_984C400 有相当大的偏移量,因此对 off_984C400 的交叉引用可能不会显示正在准备地址的代码(如果它被动态写入内存在0x984C5E0 通过其他代码)。如果您能够调试代码,那么在此处放置一个内存写入断点以查看地址是如何设置的可能会更容易(如果它不是静态的,那么调用之前的断点就足以揭示这一切,就像玛格丽特建议的那样)。
  • Is there any way I can get the static address of the function? 不太可能。如果只有一个可能的目的地,那么代码可能一开始就不会使用间接的call。例外情况是库函数调用,其中动态链接是通过间接级别完成的,而不是通过在典型操作系统上重写整个可执行文件中的call rel32 编码。

标签: assembly reverse-engineering static-analysis ida


【解决方案1】:

最可能的解释是,有问题的地址要么是具有虚函数指针(设置在其他位置)的struct,要么是vtable(如果它是C++)。指针可能在数据段中(自己检查)

如果是带有虚函数的struct,请检查地址的xrefs(可能还有它周围的地址)

vtables 在ctors 中初始化,所以在这种情况下xrefing 地址应该可以让您到达ctor

无论如何,请记住,此调用可以转换为多个可能的函数。

【讨论】:

    【解决方案2】:

    首先,您的问题与r/m32 无关。 r/m32 是一种语法,表示指令的操作数可以是寄存器或 32 位内存地址。查看英特尔 64 和 IA-32 架构软件开发人员手册第 2A 卷第 3 节的更多详细信息

    其次,[something] 表示取括号内的地址,并从该地址获取值。在 C 语言中,这称为取消引用指针。请注意,LEA 指令并非如此。

    例如。 mov eax, 0x1004000 表示将值 0x1004000 移动到 eax 寄存器中。现在,mov ecx, [eax] 将获取 RVA 0x1004000 处的任何 32 位值并将其复制到 ecx 寄存器中。

    最后,您将完全按照您的描述获得函数的地址。您仔细阅读说明,记下保存在哪里。我不知道你为什么称它为“静态”地址。

    【讨论】:

    • 我认为 OP 希望他们能够找出被调用函数的最终地址(以便他们可以反汇编它) 运行程序。地址可能是几个可能的静态代码块之一,但是指针本身不是静态的。
    猜你喜欢
    • 2014-12-23
    • 2016-08-18
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多