首页
社区
课程
招聘
[转帖]分析静态编译加剥离的ELF文件的一些方法
发表于: 2017-5-22 13:03 7120

[转帖]分析静态编译加剥离的ELF文件的一些方法

2017-5-22 13:03
7120


应公司要求,发freebuf上了,现在转到这里

概述

随着IOT安全越来越受到关注,我也会分析一些ELF文件,但是我们在分析ELF文件的时候最怕遇到静态编译和剥离外加没有编译器信息的样本了,我学习了一个网上的方法,在这里总结以下,供大家学习,也希望大家有什么其他的方法可以一起来分享

 静态分析

MD5

2ec7bbc430da10d474713cdd00cbff72

大小

461 KB (472,140 字节)

壳信息

UPX(3.91)

指令集架构

Intel 80386

由于有UPX3.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文件的一款脚本

sigmakeIDA中自带的将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这个里面可以看到Ratio1也就是100%完全匹配的



但是我们选中一个函数然后选择Diff pseudo-code



可以看到里面的反汇编比较,可以看到里面匹配成功的都是一些代码很少的函数,以我的经验来看这样一般是不可取


我们在来看看Partial matches这个对话框,可以看到Ratio最高才0.710,我觉的凡是低于0.8都到认真查看以下反汇编的对比,在对函数名进行导入


3)使用Rizzo这个插件进行生成


首先把库文件生成对应的数据库文件



生成完之后在将静态编译的文件在导入这个数据库,这个时候你可以看到确实识别了一些库函数


总结:

其实这三种方法都有一些可取之处,我在使用中为了识别更多的库函数,这三个方法也是都会尝试,比如在这个样本中还会在字符串中发现LUA的脚本引擎在里面这个时候使用diaphora进行对比也许会更好。大家有什么更好的方法,也请留个言



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 4
支持
分享
最新回复 (2)
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好难呀感觉
2018-7-19 04:50
0
雪    币: 401
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
学习了
2018-11-8 11:32
0
游客
登录 | 注册 方可回帖
返回
//