【问题标题】:`test reg, const` when `reg` contains a memory address`test reg, const` 当 `reg` 包含内存地址时
【发布时间】:2021-10-15 21:49:03
【问题描述】:

在尝试对“crackme”二进制文件进行逆向工程时,我偶然发现了一个这样开头的函数:

mov ecx, [esp+4]
test ecx, 3
jz short loc_106A9F0

函数的第一个参数(函数第一行中的MOV'd 到ECX)是一个指向字符串的指针。如果我理解正确,下一行执行TEST 操作,其中一个操作数是内存地址,另一个是常数。我想知道为什么程序会这样做,考虑到内存地址本身应该是无关紧要的事实。
简而言之,我想知道为什么程序 TEST 会是一个非零 const 的指针。

【问题讨论】:

    标签: assembly x86 reverse-engineering


    【解决方案1】:

    它正在检查指针的 4 字节对齐,即低 2 位都为零,所以
    p % 4 == 0

    这可能是您在优化 strlen 或类似函数开始时执行的操作,该函数一次读取超过一个字节的内存;见Is it safe to read past the end of a buffer within the same page on x86 and x64?

    或者它可能是一个标记指针的东西,你将int * 的低 2 位用于其他东西,因为真正的int * 在底部总是有 2 个零位(在字节可寻址像 x86 这样的机器,在带有alignof(int) == 4 的 C 实现中)。在取消引用指针之前清除它们,或者提取它们以获取额外数据。在它们都清晰的情况下进行分支可能是合理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-16
      • 2020-12-03
      • 2012-09-09
      • 2021-05-06
      • 1970-01-01
      • 2010-11-11
      相关资源
      最近更新 更多