如何进行静态分析以从汇编中的具体值中识别指针?

逆向工程 拆卸 部件 x86 静态分析
2021-06-10 04:59:56

所以基本上我正在编写一些代码来对反汇编代码进行分析工作。

被这个问题困住了一阵子,下面是一个简单的objdump反汇编asm代码的例子,基本上所有的地址符号都被翻译成了具体的值。

1. mov 0x8408080, %eax
2. ....
3. call *%eax

所以基本上对于上面的例子,很容易确定0x8408080第1行使用的是代码的地址,并且我知道将所有落在范围内的值.text section作为指针来启发式考虑相对容易

但是,如何使用静态分析来自动识别此问题?(我想写一个工具,尽可能准确地分析大量代码)

我知道以某种方式我应该使用常量传播来向前进行分析,但基本上因为我是程序分析的新手,我只是不知道从哪里开始..

有没有人有这样的经历?或者是否有任何已实现的工具我可以寻求帮助..?

2个回答

一些反编译器(例如phoenix)使用值集分析来恢复 cfg。

论文摘要

本文涉及用于分析二进制可执行文件的静态分析算法。这项工作的目的是恢复类似于可以为用高级语言编写的程序创建的中间表示 (IR)。我们的目标是为病毒、蠕虫和移动代码等程序执行此任务。对于此类程序,符号表和调试信息要么完全不存在,要么不能依赖(如果存在);因此,论文中描述的分析没有使用符号表/调试信息。

论文中讨论的主要分析称为值集分析,它同时跟踪地址值和整数值量。它与为用高级语言编写的程序开发的指针分析算法有关,该算法确定每个指针变量可以保存其地址的变量集的过度近似。同时,值集分析类似于范围分析和其他数值静态分析算法,它们过度逼近每个变量可以容纳的整数值。

论文中描述的技术已作为 CodeSurfer/x86 的一部分实现,CodeSurfer/x86 是一种用于浏览(“冲浪”)、检查和分析 x86 可执行文件的原型工具。

基本上,区分值、地址和指令是类型恢复系统的作用

Alan Mycroft 有一篇优秀的开创性论文,关于一种称为基于类型的反编译(ESOP'99) 的技术,它可能会给你一些关于如何做的想法。

另一篇较新的论文描述了目前在Phoenix 反编译器中使用的技术,该技术称为:TIE:二进制程序类型的原理逆向工程(NDSS'11),由 CMU 的人编写,深入介绍了他们使用的技术。

除此之外,可以使用Reps 和 BalakrishnanDIVINE 技术(VMCAI'07)重建类型(数组、结构等)形状两位作者还发表了一篇更广泛的期刊论文(TOPLAS'10),收集了他们关于该主题的所有工作。

尽管如此,在这个领域还有很多其他的作品,但我相信我上面引用的论文或多或少是“类型恢复”领域的当前趋势。