当我们进行逆向工程时,我们有几个层次的模型。其中之一是指令语义模型,该模型告诉我们每个本机指令如何修改指令状态。我们正在那里取得进展。但是,另一个问题是平台语义的问题,它是一个更高的层次。

例如,一个用户空间linux程序的高级模型将需要包含有关mprotect的信息,并且它可以更改某些代码区域的可见性。线程和回调语义也是一个平台建模问题,我们可以从其标头中发现程序入口点(这是另一种语义!但是我们可能不会妥协),但是其他入口点在程序中发布。

我们目前在以实践者理解的方式捕获高级平台信息方面的最大努力/最新技术是什么?机械/自动理解系统又如何呢?我知道IDA具有(或必须具有)有关不同平台API的信息,似乎知道,当立即数是pthread_create的参数时,则该立即数是指向代码的指针,应该这样对待。除此之外,我们还有什么?

评论

您是在请求诸如REIL或BUP之类的东西,而是在“程序” /代码级别而不是指令级别吗?

他指的是应用程序在其中运行的环境的模型,例如系统的“ IL”。例如,对调用connect()和随后的调用recv()建模的最佳方法是什么。

#1 楼

直接检测

在最低级别上,您只需拥有库的副本,然后检查它们是否是所使用的。

基于签名的检测

在更高的层次上,IDA FLIRT仅存储有关库的足够信息以标识其用途。但是它的主要好处是减少了磁盘使用量……值得注意的是,您可以在默认的定义中添加更多的定义。

Hex-Rays在这里深入讨论了该技术。

通用识别

诸如Coverity或Clang静态分析器或KLEE之类的工具更通用,并且更可能包含用于编程习语的模型。

我唯一知道的接近开源的IDA的想法是雷达,它可能具有一定的图书馆认可度。也是radare的主页。我一直在寻找,因为我正在寻找类似IDA的免费支持SPARC的工具,尽管我还没有时间尝试它,但它看起来像radare一样。

从我所知道的REC和Boomerang不能像IDA那样识别库,而只是尝试反编译所有内容。 BAP对二进制文件进行分析,并从BitBlaze项目的Vine组件派生而来,下面的两个项目也是其中的一部分。

流量分析

TEMU和Rudder在这里查看相当先进。并在执行时处理代码。 TEMU有助于将输入和输出与流相关联。

值得注意的是,Bitblaze工具旨在提供可在IDA中使用的跟踪,尽管它们很可能可以用于其他用途。

提供的TEMU听起来最接近您想要的声音。...它允许您标记污染的输入(内存位置,物理输入等),并检测这些污染对执行的影响。如果您想试用TEMU并使用较新的Linux发行版(过去几年中大多数使用GCC 4+的版本),请按照此处的说明进行操作。

#2 楼

我不确定我是否理解问题,但是各种沙盒解决方案(Norman,Androguard)往往会在系统上生成事件日志,这让我对平台及其状态有所了解。
除此之外,不了解任何可帮助您通过静态分析确定系统状态的工具。我使用调试器在可能的情况下回答此类问题,而在不进行手动静态分析的情况下进行回答。

评论


我认为这与系统功能的实际建模有关。我唯一能想到的是静态代码分析产品(例如Coverity,Fortify和Klocwork)是由哪种代码完成的。

–彼得·安德森(Peter Andersson)
13年3月28日在15:42