立即数搜索是IDA中三种主要搜索类型之一。虽然不太为人所知,但在某些情况下非常有用。以下是一些例子。
独特(魔法)常量
如果你知道程序中使用的一些独特常量,寻找它们可以让你缩小需要分析的代码范围。例如,如果程序报告一个数值错误代码,你可以寻找它以找到可能返回该错误的位置。
RISC处理器中未发现的交叉引用
许多RISC处理器使用固定宽度的指令,这使得在指令中编码完整地址值的空间不足。因此,它们不得不通过小片段构建地址值。例如,在SPARC中,加载一个32位值必须作为一对指令来完成:
ounter(lineounter(line
sethi %hi(Prompt),%o1
or%o1,%lo(Prompt),%o1
其中%hi
返回值的高22位,%lo
返回低10位。由于这样的指令可能不会紧挨在一起,IDA可能无法“连接”它们并恢复完整的32位值,导致缺失的交叉引用。因此,如果你有一个位于地址N
的字符串常量,并认为它应该从某处被引用,进行N&0x3FF
的立即数搜索应该会生成一份可能引用该地址的指令候选列表。
结构字段引用
有时你可能有一个在特定偏移量上具有相当独特字段的结构(不是一个小或整值),并希望找到它在程序中的使用位置。例如,让我们看看最近的Windows内核和结构_KPRCB
。在偏移量63Eh处,它有一个字段每物理处理器核心数:
如何找到它的使用位置?搜索值0x63e会给出使用该值的指令列表。
然后你可以检查这些指令,看看它们是否确实引用了_KPRCB
字段而不是其他东西。
这可能是立即数搜索的最佳用途之一,但它不能替代手动分析。例如:
-
它可能会错过不直接使用该值而是通过某种方式计算的引用; -
可能会出现误报,特别是对于常见或小值; -
该字段可能通过更大的包含结构间接引用(例如, _KPCR
包含_KPRCB
作为成员,因此来自_KPCR
的引用将有一个额外的偏移量)。
学习资源
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA技巧(104)立即数搜索
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论