我被困了一段时间,这是objdump的反汇编asm代码的简单示例,基本上所有地址符号已转换为具体值。
1. mov 0x8408080, %eax
2. ....
3. call *%eax
因此,基本上对于上述示例,很容易确定第1行中使用的
0x8408080
是代码的地址,我知道启发式地将落在.text section
范围内的所有值都视为指针是相对容易的。 但是,如何使用静态分析来自动识别此问题? (我想写一个工具来尽可能准确地分析大量代码)
我知道我应该使用常量传播来向前进行分析,但是基本上,我是程序分析的新手,我只是真的不知道从哪里开始。
有人有这样的经历吗?还是有任何我可以寻求帮助的已实施工具?。
#1 楼
一些反编译器(例如phoenix)使用值集分析来恢复cfg。论文摘要
本文涉及用于分析二进制可执行文件的静态分析算法。这项工作的目的是恢复类似于以高级语言编写的程序可以创建的中间表示(IR)。我们的目标是对病毒,蠕虫和移动代码等程序执行此任务。对于此类程序,完全不存在符号表和调试信息,或者如果存在,则不能依赖符号信息和调试信息。因此,本文中描述的分析没有使用符号表/调试信息。
本文中讨论的主要分析称为值集分析,它跟踪地址值和同时具有整数值的数量。它与针对用高级语言编写的程序开发的指针分析算法有关,该算法确定变量集的每个地址的近似值,这些变量集的地址过高。同时,值集分析类似于范围分析和其他数值静态分析算法,它们过度逼近每个变量可以容纳的整数值。
本文描述的技术已经作为CodeSurfer / x86的一部分实现的,CodeSurfer / x86是用于浏览(``冲浪''),检查和分析x86可执行文件的原型工具。
#2 楼
基本上,区分值,地址和指令是类型恢复系统的作用。Alan Mycroft发表了一篇精彩的开创性论文,内容涉及一种称为基于类型的反编译技术(ESOP'99),该技术可能给您一些有关如何执行操作的想法。 '11)由CMU的人撰写,并深入介绍了他们使用的技术。
除此之外,可以重构类型(数组,结构等)的形状使用Reps和Balakrishnan的DIVINE技术(VMCAI'07)完成。两位作者还发表了更广泛的期刊论文(TOPLAS'10),收集了有关该主题的所有工作。
尽管如此,该领域还有很多其他著作,但我相信我在上面引用的论文或多或少是“类型恢复”领域中的当前趋势。
评论
谢谢您的回答。我实际上已经阅读了一些有关VSA的论文。基本上,这是使用VSA的正确方法吗?利用VSA分析“间接控制流转移的候选资格”是可行的,这在基于逆向工程的静态分析中是极为关键的问题。但是,恕我直言,我无法弄清VSA与我提出的建议之间的关系。
– lllllllllllll
14年7月31日在21:30
无论如何,CodeSurfer / x86不是开源的,我发现甚至很难以某种方式针对我提出的问题重新实现玩具版本……
– lllllllllllll
14年7月31日在21:31
当然,这不是唯一的选择。一个更简单的选择(也很成功)是使用启发式方法进行的简单递归反汇编。这是ida采取的方法,具有良好的实际效果。至于开放源代码,我相信vine会在2012年的此博客文章ed中实现vsa和bap至少部分实现edmcman.bitbucket.org/blog/2012/07/23/cfg-recovery-in-bap
–百老汇
2014年7月31日在21:54