我从此链接中学到了拆卸方面的挑战。该文章列出了以下六个挑战:


代码区域中嵌入的数据
可变指令大小
间接分支指令
没有显式CALL的函数可执行文件的代码段中的站点挑战。假设我们要分解一个可执行文件,一个可以100%覆盖代码的输入集和一个仿真器(例如QEMU)。然后,我们可以对仿真器进行检测,以输出由仿真CPU执行的每条指令以及相应的内存地址。之后,我们可以将每条指令转换为汇编指令,然后将整个程序反汇编。

您能告诉我为什么这个想法行不通吗?

#1 楼


一个可以100%覆盖代码的输入集

这可能很难实现,特别是如果代码行为取决于您不直接控制的内容(时间,内存,操作系统版本/环境,随机数生成器等)。其他观察结果:

实际上执行所有代码可能会花费更多的时间,超出您的承受能力。
执行代码的某些部分可能需要您无法满足的条件(例如特定的硬件外围设备)
您将错过二进制形式的代码,但永远不会执行(死代码)。在某些情况下,此类代码可以揭示有关二进制的其他信息。
您的方法可能会发现所有代码,但可能会遗漏很多数据。是完全没用的。实际上,这方面已经有一些工作。例如,签出S2E(选择性符号执行)项目:
https://sites.google.com/site/dslabepfl/proj/s2e

从概念上讲,S2E是自动路径具有模块化路径分析器的资源管理器:资源管理器将目标系统驱动到所有感兴趣的执行路径,而分析器检查每个此类路径的属性(例如,查找错误)或仅收集信息(例如,计算页面错误)。可以通过多种方式指定所需的路径,并且可以将现有的分析器组合起来以构建自定义分析工具,也可以使用S2E API编写新的分析器。
S2E有助于使基于符号执行的分析对于运行的大型软件切实可行在实际环境中,而无需对这些环境进行显式建模。


#2 楼


我们可以使用动态分析(或仅使用仿真器)来实现100%的代码覆盖率吗?


不,如果我是对的,那等于图灵暂停问题。 >

基于仿真器的反汇编方法


恐怕这可能不是一个新主意,并且代码覆盖率是一个大问题。 br />但是总是有可能找到一个不同的角度并在相关领域做出一些贡献。推动相关想法的未来。

它利用仿真器来分解代码,动态污点分析以将具体价值提升为符号,并以某种方式重新使用已分解的asm代码(嵌入C代码中)。

希望对您有所帮助

#3 楼

如果您想要一个简单的答案。代码覆盖率。如果仅跟踪被调用/执行的代码,您怎么知道找到了所有代码。

当代码具有更改内存的行为或理解代码时,它可以很好地理解代码。就像在我的一个项目中一样,我知道我在软件中实现了一些双重数学功能。因此,运行一个mu以查看结果对于查看以标识除法和加法函数的结果很有用。但是如果从入口点开始,e将陷入无限循环,因为外部
中断在预期的时间没有触发。

评论


谢谢!为了覆盖代码,许多程序都附带了测试套件。我们可以假设它们可以覆盖大多数代码。

– ZillGate
2014年7月10日4:04

@zillgate这将是一个非常有缺陷的假设

– Simeon朝圣者
2014年7月10日下午4:06

实际上,测试套件通常只占很小一部分基本块。比人们希望的要小得多。

–百老汇
14年7月10日在16:38

#4 楼

只要您知道二进制文件的边界(数据/代码在哪里开始)并且知道Instrustion集,就可以将反汇编技术作为一种问题。在x86上的UNIX ELF文件中,只需在其上运行objdump即可获得反汇编的输出:他们想阅读代码边界,了解代码的某些部分做什么,然后覆盖其中的某些部分。问题要难得多(例如:什么时候您知道被覆盖的片段实际上不应该存在?)

评论


谢谢!但是,如果将拆卸作为一种技术不是问题,那么为什么问题中的文章提到了这些挑战?并且根据该文章,必须存在一些objdump无法正确反汇编的二进制情况,对吗?

– ZillGate
2014年7月10日,下午3:32

“只要您知道二进制文件的边界(数据/代码在哪里开始)”,这就是只有原始二进制文件时很难解决的问题

–伊戈尔·斯科钦斯基♦
2014年7月10日在10:21

@IgorSkochinsky通过“只有原始二进制文件”,您是说二进制文件无法执行?如果是这样,那么模拟器的想法就行不通了,我们需要使用线性扫描或递归遍历...

– ZillGate
2014年7月10日12:30

@ZillGate:不,我的意思是我们有一个可执行文件,但我们不知道数据的确切位置和代码的位置(入口点除外)。例如。 Wojciech建议的objdump在将跳转表与代码混合时会出现问题。

–伊戈尔·斯科钦斯基♦
2014年7月10日13:15

@ZillGate您将全面了解程序是怎么做的,但是由于该程序并不总是执行其所有代码,因此您将无法完全重构(其源代码)。您正在考虑的方向是正确的,但是很难使其正常工作。例如:QEMU接受磁盘映像或ELF文件。如果您有ELF文件,则意味着可以使用比QEMU更好的工具进行二进制分析。磁盘映像假定您在没有操作系统的情况下运行。

– Wojciech A. Koszek
2014年7月10日14:44