我们之前讨论过偏移量与基址。在位置无关代码中,常常使用一种偏移量的变体,通过一个小技巧可以轻松处理。
让我们来看一个来自ARM32固件的ARM函数:
IDA将地址88和8C处的值转换为偏移量,因为它们恰好是有效地址,但如果你查看代码的操作(我已添加注释描述发生的情况),我们会看到这两个值都被加到它们加载的地址(0x88)上,即它们是相对于它们自身位置的(或自相对的)。
要获得它们所指的最终值,我们可以使用操作“编辑 > 操作数类型 > 偏移量 > 偏移量(用户定义)”(快捷键Ctrl–R),并输入基址为地址值(0x88),或者对于地址00000088
的值,使用IDC关键字here
,它会扩展为光标下的地址。
IDA计算最终地址并用一个使用特殊符号.
的表达式替换该值,该符号表示ARM上的当前地址:
对于地址0000008C
的值,here
不起作用,因为它扩展为0x8c,而加数是0x88。我们可以使用以下几种选项:
-
使用实际值 0x88
作为基址 -
使用表达式 here-4
,它解析为0x88。 -
使用 here
,但在目标增量字段中指定4。
IDA将使用增量作为表达式的附加调整:
现在我们可以看到函数实际使用的地址并进一步分析。
学习资源
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA技巧(110)自相对偏移量
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论