应公司要求,发freebuf上了,现在转到这里
概述
随着IOT安全越来越受到关注,我也会分析一些ELF文件,但是我们在分析ELF文件的时候最怕遇到静态编译和剥离外加没有编译器信息的样本了,我学习了一个网上的方法,在这里总结以下,供大家学习,也希望大家有什么其他的方法可以一起来分享
静态分析
MD5 | 2ec7bbc430da10d474713cdd00cbff72 |
大小 | 461 KB (472,140 字节) |
壳信息 | UPX(3.91) |
指令集架构 | Intel 80386 |
由于有UPX(3.91)版本的壳,这里会发现使用官方的UPX –d 无法进行脱壳
通过分析可以发现攻击者在样本后面添加了附加数据,只要将下面的阴影部分数据去除则可以使用UPX –d 进行脱壳了
我通常分析linux样本,首先会file一下 可以看到这个样本是静态编译,并且被剥离的
在用readelf文件进行去看看,发现并没有.comment这个段,这个段通常是用来保存编译器信息的
一般linux的样本最不愿意分析的就是静态编译加剥离的了,可以先放到IDA中先看看里面自带的sig信号文件是否可以识别,你会发现里面都没有识别出来…..
这个时候还不能放弃,搬上另一个神器lscan,这款工具主要是用来识别样本中使用的库文件的版本,并却里面自带了sig信号文件,我们用这个工具试一下
使用这个工具可以发现在lscan库中的文件识别率都很低,这样即使吧sig文件放入也不会识别出来的
这个时候我们只能求助于strings这个工具了,这个文件中字符串可能是发现点蛛丝马迹
可以看到里面有一些ssh的自定义函数函数,依据我的经验来看,里面应该用到了ssh2的一些库函数
这里我们可以分别使用三种方法就库函数进行识别,看看识别的怎么样
(1)第一种方法是idb2pat.py+sigmake生成符号文件
idb2pat.py 是fireeye出的一个自动生成pat文件的一款脚本
sigmake是IDA中自带的将pat文件生成sig文件程序,首先我们从Ubuntu中取出ssh的库文件,这个我选择的libssh2.so.1.0.1这个动态库
首先生成sig文件这个文件这个时候会发现会有两个冲突
这个时候生成的不是sig文件而是这两个文件,这个时候你要是想快速生成sig文件,你就吧后缀为exc文件的前四行注释删除在运行一遍就行了,这个时候将生成sig文件拷贝到IDA安装目录下的sig中就可以了
这个时候用IDA打开被静态编译剥离的文件,并打开这个sig文件
下面是识别结果,结果是一个也没有识别出来。。。。
(2)对比法,使用diaphora这两个文件二进制数据进行对比。
首先生成这个文件的数据库文件
然后在打开要比较的静态编译和剥离的文件,进行下对比
下面看下对比结果这里主要要关注Best matches 和Partial matches 这两个对话框,首先看一下Best matches这个里面可以看到Ratio是1也就是100%完全匹配的
但是我们选中一个函数然后选择Diff pseudo-code
可以看到里面的反汇编比较,可以看到里面匹配成功的都是一些代码很少的函数,以我的经验来看这样一般是不可取
我们在来看看Partial matches这个对话框,可以看到Ratio最高才0.710,我觉的凡是低于0.8都到认真查看以下反汇编的对比,在对函数名进行导入
(3)使用Rizzo这个插件进行生成
首先把库文件生成对应的数据库文件
生成完之后在将静态编译的文件在导入这个数据库,这个时候你可以看到确实识别了一些库函数
总结:
其实这三种方法都有一些可取之处,我在使用中为了识别更多的库函数,这三个方法也是都会尝试,比如在这个样本中还会在字符串中发现LUA的脚本引擎在里面这个时候使用diaphora进行对比也许会更好。大家有什么更好的方法,也请留个言
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)