详解对ELF64之手动脱壳的逆向分析

原创
02/13 18:49
阅读数 734

应一位朋友之邀,对“吾爱论坛‘ELF64手脱upx壳实战’一文”进行了再重现,考虑到朋友他对原文过程理解不深,特抽空行文,着重对每个步骤、每个知识点进行了分解,现共享出来以回馈社会;同时此文对IDA远程调试、编写idc脚本有指导作用。

原文:https://www.52pojie.cn/thread-1048649-1-1.html,是一篇打了精华标签的帖子,我希望你不要看作者写的,因为你如果按文中所写步骤,可能会有些地方跳不过去,带来困惑;为避免带此景,建议看此文为好,不是夸我比作者水平高,毕竟我是站在他肩膀上的。

 

 

一、作者提供的样本:

链接: 

https://pan.baidu.com/s/1v_uL26C6FooLhHHSbPUhmQ

提取码: ubmc解压密码:52pojie.cn

 

样本名:upx_linux;

 

二、分解过程

在虚拟机里上传upx_linux样本,放于root目录下;虚拟机IP为192.168.152.138,下图示:

确认样本upx_linux是32位还是64位的程序?

readelf -a upx_linux,下图可以看到为64位程序;

上图为ELF文件头,前四个字节为标识:7f 45 4c 46,意思就是:ELF,下图:

5个字节标识:为1,则32位;为2,则为64位;

这里建议用010editor这个编辑器,它提供了很多脚本可以自动地识别出文件格式,能对当前字段进行说明。

 

上传IDA服务端程序到虚拟机linux,因为我们要用IDA进行远程调试,如图:

因为这里的文件是64位的,所以将linux_server64上传到root目录下;同理,如果是32位,就上传linux_server,并将两文件赋运行权限,因为要运行程序;

chmod +x linux_server64

chmod +x upx_linux

 

linux_server64运行起来,

运行起来了,后端监听23946端口;

 

下面开始ida远程连接,如图操作、配置

如上图这样配好,OK完成;


启动代码调试:

程序定位在了上图入口处:44F058H,同下图文件头中的入口地址一致:

一直单步调试下去,来到这里:

F7进入这个call;一直往下单步:

来到图中位置,发现有三个向上的循环,直接在红色位置下断F2,按F9跳出三个循环,来到下断处;

如上图,这里有个call,不用进去,F8过去;来到jmp的跳转[r15],看看是什么:

[r15]指向40000CH处,执行过去,

跳转到40000CH处,注意看上图,这不是ELF文件头嘛(方框处),并在文件头位置临时放置代码(椭圆处),很不正常啊!看来是跳转语句,应该要到正常入口了,胜利在望!继续执行,

来到了这里,看着代码,觉得舒服多了,这里应该就是程序的正常入口OEP了,upx壳脱掉了。

下面就要将这些内存代码dump出来,用作者提供的脚本;

执行完毕了,上图为脚本输出回显窗口。已dump到文件中;将此dump文件上传到linux中,运行正常,OK了。

 

    三、IDC脚本的理解

作者的代码写得很清楚,红笔框出来的代码是重点,尤其是当你对RLF64文件头格式不清楚时就觉得不太好理解;我这里画了张图,结合idc代码帮助理解。

关于ELF64位的文件头,可以参看:

https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h#L220

也可以简单点,看这个图:

最好,还是要结合010editor载入的ELF文件,以及在动态调试中的ida的实际值来结合查看,这样才能精准地理解ELF格式;如下图,可以仔细品味品味。


分析到这里就要结束了,内容很多,希望你能静下心来慢慢消化,终将会有很大的收获,也就不枉我的辛苦了(两个中午没休息)!



本文分享自微信公众号 - MicroPest(gh_696c36c5382b)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部