最近常常遇到一个反编译的问题,当反编译没有高级元数据的代码(尤其是固件)时,你可能会看到看起来很奇怪的地址表达式(如上),这些表达式似乎没什么意义。
这些是什么/如何修复/改进伪代码?
因为在CPU级别上,地址和简单数字之间没有区别,所以区分地址和普通数字是一项困难的任务,在不实际执行代码的情况下,一般是无法解决的。IDA使用一些启发(heuristics)式方来尝试和检测数字何时看起来像地址,并将这些数字转换为偏移量,但这样的启发式方法并不总是可靠的,并且可能导致误报。当数据库在 0
附近具有有效地址时,特别容易出问题,因为很多小数字看起来像地址。反编译器依赖于IDA的分析,并使用其提供的信息来产生伪代码,这些伪代码被准确的识别成表示机器代码的行为。然而,如果分析出错,会适得其反。值得庆幸的是,IDA是交互式的,允许修复几乎任何内容。
在上述情况下,通常最简单的算法如下:
1.将光标定位在错误的地址表达式上
2.按下 Tab 切换到 disassembly。你应该在错误的偏移表达式上或靠近错误的偏移表达式。注意,它并不一定和在伪代码中看到的相匹配。
3.将其转换为普通数字,例如按Q(十六进制)、H(十进制)或#(默认)。
4.按 Tab 切换回伪代码F5刷新。错误的表达式会转换为普通数字或其他上下文相关表达式。
原文始发于微信公众号(军机故阁):修复反编译器中的错误地址引用
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论