Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

安全论文每日读 2015.02.11

今天介绍的二进制代码中密码学算法识别主题的论文的最后一篇,推荐的论文 是2012年发表在CCS会议上的的论文Aligot: cryptographic function identification in obfuscated binary programs,论文可在 https://hal.inria.fr/hal-00762924/document 下载,作者来自于法国南锡University of Lorraine和加拿大Polytechnique Montréal

这篇论文主要想要解决在混淆代码中识别密码学算法的问题,文章承接了2012年Groebert等人论文中提出的利用I/O特性来精确识别密码算法的想法,指出即便在混淆后的代码中,这种输入输出关系的语义特性仍然保留。那么问题其实原来需要处理的那些难点:如何精确定位密码算法的函数边界和输入、输出Buffer,以便获取输入-输出关系和已有算法模版进行比对。作者的工作基于一条记录执行的Execution Trace,同样使用了PIN instrumentation framework作为基本的插桩平台。拿到trace之后,需要在其中寻找密码学函数的边界,这里作者基于Lutz 2008年的master thesis中提到的关于loop是密码学函数的基本特征的特点进行识别,既可以解决函数边界的定位问题(利用call ret这样的指令来做定位容易受到编译器优化和wrapper函数的影响),又能够解决作者题目中提出来的在面对代码混淆时的识别难题。

然而,loop本身是一个非常常见的概念,作者提出了一种精确定义专用于适配密码学函数,这里作者引用了Kobayashi之前的工作(Dynamic characteristics of loops. IEEE Trans. on Computers, 100(2):125–132, 1984.)来帮助定义loop,并稍微修改了定义,限制在同一个loop body中不能出现两条相同地址的代码,并给出了一个详细的Loop Instance Detection Algorithm,需要了解细节的同学可以参考论文。在loop detection完成之后,通过对loop中的memory reading and writing进行分析,加上一些数据的聚合,就可以得到一个single loop的input和output,然后再把多个loop instances的input和output连接起来形成Loop data flow,最后就可以去做输入-输出比较了。

作者开发了一个叫做Aligot的工具(源代码开放:http://code.google.com/p/aligot/ ),并对一组malware中的TEA,RC4,AES,MD5以及RSA的MOD-MUL进行了检测,实验结果对比一些static analysis tools,自然是全部检测出了所有的算法存在。非常有趣的是,作者在检测过程中发现有一些malware里面的TEA算法检测不出来,经过手工确认发现该算法的实现是错误的,然后作者去检查了一下,发现可能是因为malware开发者在写代码的时候抄了一个俄国论坛上的错误实现代码,因此导致加密解密的输入-输出关系和标准模版不符,于是作者把这个算法起名为Russian-TEA……

这篇论文虽说是对obfuscated code中密码算法做检测,其实在处理混淆代码方面显得不够清楚,实验部分只是展示了能对obfuscated code中的加密算法进行很好的检测,并未具体对这个检测进行分析,而且分析的obfuscation多为code packer处理后的代码,实际上对于动态执行分析而言,代码的内容并未经过大的变换混淆。