【安全与逆向】- so文件格式分析

【安全与逆向】- so文件格式分析,第1张

为了增加反编译难度,保护应用安全,现在越来越多的应用把一些重要的逻辑,加密,重要信息用so库存储。如果想反编译so,那么我们就需要了解so文件格式。这样有助于帮助我分析so文件内容和加固so,防止自己的so被别人轻易破解。

so文件使用的是elf格式来存在信息,所以,我们需要了解elf文件格式。这样就可以读取到我们需要的数据。

这篇文章不会把基本的东西讲太多,网上关于so文件格式也有讲解,本文会把自己分析过程遇到的问题,网上查不到,或者你们在学习过程可能会产生的疑问一一列举出来。

对于基础的东西请自己百度或者看下面给出的ELF文件格式文档。

ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容,而且它们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。

在Linux用该命令可以直接查看so相关信息,mac可以百度,查看替代方案。

so文件二进制数据图

接下来就以ELF头来做分析

看一下ELF头在elf.h中的定义,如果没有源码,可以参考上面的ELF文件格式文档。

e_ident[EI_NIDENT]这16个字节代表数据如下:

EI_NIDENT :e_ident数组的大小。

剩余字节,可对照数据结构查看,我们用命令看一下ELF头信息

从ELF信息里面可以拿到:

通过e_phoff和e_phnum,e_phentsize可以找到程序头部表的在文件中的起始地址和个数以及单个程序头部表的大小。

同理,可以找到节点表的起始地址和个数以及单个表的大小。

010editor工具左边显示了二进制文件的地址,很方便查看。

通过命令看看具体数据

第一列就是Section表索引,还记得上面的e_shstrndx字段吧,它表示节区字符串表在节区头部表格中索引。由上面的数据图可以看出e_shstrndx是0x25,即37,对于图中的.shstrtab这个正是节区字符串表的名字,具体这些名字代表什么,请查看文档。

从二进制数据看到只是一个数字,并不是像.shstrtab的字符串,那么又是怎么回事呢?

在Section表数据结构中的一个字段是:sh_name 表示节区名称,表示在节区字符串表中的索引,即信息很可能存储在.shstrtab这个字符串表中。根据上面图中的Off得到起始地址。

Section表数据结构索引为1的sh_name值为3A,即58。而节区字符串表的起始地址是E9F4a,即图中为红色00的位置,然后从这个位置往后数58个字节,刚好是图中蓝色部分的数据,是不是Section节区表格中的第二行的名字(图中少了nt字符,我怀疑是长度过长,没有显示出来,经验证短一点的,完全一只)。

知道了sh_name起始地址,那怎么知道到哪里结束呢,sh_name必须以空字符结束,从起始地址一直找到为空字符的地方即可。

更多请参考文档: 链接: https://pan.baidu.com/s/1GgUqFF1dJ9sbCoSU3XzElw

   密码:zmac

参考: https://www.cnblogs.com/1024Planet/p/6272620.html

 linux很少有需要crack的软件,所以最近总是自娱自乐。自己写的软件自己破着玩但是由于都是知道自己的手段,没有什么意思。真的希望有高手们写些crackme for linux 。最近看了看windows的脱壳大致的理解了脱壳的原理,之前没有怎么接触脱壳,通常只是选择没有壳的软件看看。在linux下的壳没有找到几个。只找到了一个upx的壳,在windows下是个弱壳。实际上在linux下面也是弱壳,完全可以使用"upx -d"的命令解决问题。但我总是喜欢自己手动的。呵呵....纯属于自娱自乐。

ok,开始我们的linux的upx的脱壳之旅.........

我在选择工具的时候花了很多时间,忽然发现GDB在upx面前是那么的苍白无力...也终于知道为什么有人说GDB不适合做逆向了...虽然软件在调试器里可以正常于运行,正常下断。但是根本无法查看反汇编的代码.......。

无奈无奈....使用传说中最好的工具 IDA 为此我特地简单的学习了一下IDC脚本的使用方法...

没有什么资料可以参考,是一件很不愉快的事情,因为不知道能不能成功。不管了,一步一步来吧...

我用“upx -d“ 脱出了原来的文件,发现文件是全的,没有任何部分丢失,所以我相信这些文件会出现在进程空间的某个时间的某个角落,这个很大的坚定了我手动脱壳的信心(但是实际上到这篇文章的结尾我也没有能够在找到完整的程序文件,但我相信理论上内存空间中应该会出现完整的文件的...)。

我的加壳软件是我上次文章中用到做外挂的mines(扫雷游戏)。先找到了upx-3.03-i386_linux 软件 附件中我会给出的免的度这篇文章的人去寻找了。

对我们目标软件加壳,命令如下,的确是个好用的压缩壳软件,直接有54%的压缩律。

linux下可执行文件不是以后缀命名的,后缀只是让 *** 作人员自己知道这是什么类型的文件,对本件本身没有任何意义。

举栗:

test.sh #是以shell写的脚本

test.py #是以python写的脚本

文件可执行是权限问题:x权限表示可执行


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7325386.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存