查看原文
其他

换种方式理解 ELF 文件格式

Emiya侍郎 看雪学苑 2022-07-01

本文为看雪论坛优秀文章

看雪论坛作者ID:Emiya侍郎




这些天整理笔记,整理到 ELF 格式的时候,内心总是:这是我的笔记吗?我怎么会这么记笔记?又翻了一下虫神的 ELF 文件格式示意图,依旧一脑袋浆糊,所以打算从文件构造的角度理解 ELF 格式。

 


考虑一般 ELF 文件




我感觉要明白一个思维,计算机中存储的都是数据,无论是地址还是值,无论是简单类型还是复杂结构,总要有方法进行管理、访问、控制。
 
首先,能很容易明白的是,ELF 可执行文件它是分Section的。

每一种 Section 都有着不同的用处,其中比较重要的就是:

* .text -> 代码

* .data -> 初始化的全局静态变量和局部静态变量

* .rodata -> 只读变量和字符串常量

* .bss -> 未初始化的全局变量和局部静态变量

* .symtab -> 符号

* .strtab -> 字符串

* .plt,.got -> 动态链接的跳转和全局入口

暂且不考虑这些Section的细节,接下来能想到的是既然有Section,计算机如何才能找到对应的Section。


那么就需要告诉计算机相应 Section 的完整属性,比如:

* Section name -> 叫什么名字
* Section type -> 所属类型
* Section flag -> 能支持什么操作,写?读?执行?
* Section size -> 大小

* Section offset -> 在文件哪里?


这些属性合并在一起,代表着这个 Section,所以起了个名字叫 Section Header。

举个不恰当的例子,你要想去公司里找特定部门谈生意,那你肯定的知道部门的名称,在公司的哪栋楼,多少人,能谈什么生意,谈生意的规则。

 

一个公司也不止一个部门,一个 ELF 文件也不止一个 Section,有时需要多找几个,怎么快速发现呢?此时,计算机的常见思维出现了,我需要找个管理来整合这些资料,是的,没错,将这些数据整合成表,变成了Section Header Tables。
 
现在有了 Section Header Tables,计算机就能够通过它访问各种数据,但是问题来了,对于 Section 来说,像类型、flag,size 等信息都能在相似的数据类型下良好的定义,名字该怎么半?名称的长短伸缩性不小,而且有些通用性并不高,如:
* .init
* .eh_frame
* .gcc_except_table

* __libc_thread_freeres_fn


如果不管不顾,那这个 Section Header Tables 也太乱了,会跟着名称来回波动,因此,就再构造一个名称表,把这些 Section 的名字都记录下来,如果想知道对应名称,就到这个表中取,如此一来,每个 Section Header 的大小也就可以固定了,真的整洁,于是乎,变成了 Section Header String Table, 把它也放在 Section Header Tables中。

 

同理,也想以固定的格式保存各个 Section 中的变量名,直接抄波代码,修改个表名,起名叫做 String Table。
 
到现在,计算机已经能通过 Section Header Tables 获取很多信息了,
 
可是 ELF 也是有类型的,像可重定位文件,要执行就得链接,在链接过程中,当 A 中调用了 B 的函数,就像两个公司进行对接,你要对接的人永远不可能原地不动。

如何像别的公司便携的告诉对接人的信息,那么就起个花名,比如 ”肉丝“,这样跑到该公司楼下一问便知,像某巴这么多花名,总不能肆意泛滥,随意起名,甚至可以脑袋一热,统一给花名修饰一下,丑是丑了点,可它不会撞名啊。
 
同上,我再整个花名册,这下就方便对接了吧,效仿国际化,起个名字叫:Symbol Table, 也加到 Section Header Tables 里面吧。


哇咔咔,作为领导管理一个公司,不应该自顶向下吗?关注细节可不是你该干的事,所以,给你单独立一个模块,以后发名片好用,起个名字叫 ELF Header,里面拥有公司的各种基础信息。
 
这样的一个格式已经足够平时对外营业了,可是,作为大公司,要注重安全不是,平时的内部网络攻防也应该搞起来啊。这不得按业界习惯,学习虎符公司整个三件套,把公司部门组合成红蓝紫三队,Code Segment 负责攻击,Data Segment 负责防御,其他部门负责旁观、策划、后勤。作为演练攻防,当然要让老板近距离看到效果,那就离 ELF Header 近一点吧!结构嘛,也就仿效平时的部门结构吧!
 
整合一下,这就是公司的日常,哦不,ELF 的一般结构。


至此,一个 ELF 文件的格式也基本分析结束,突然觉得,拿公司来举例真是好主意,感觉画漫画展示效果会更好!有没有大佬感兴趣,涂抹一两笔。
 
停笔,如果有时间,俺也来个图解 ELF 也是极好的
 
个人拙见,仅供参考,写此一文,博君一笑足以 orz。



参考资料




1. 程序员的修养


2. CTF_all_in_one (再次膜拜大佬)



- End -




看雪ID:Emiya侍郎

https://bbs.pediy.com/user-home-752555.htm

  *本文由看雪论坛 Emiya侍郎 原创,转载请注明来自看雪社区。



《安卓高级研修班》2021年6月班火热招生中!


# 往期推荐





公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com



球分享

球点赞

球在看



点击“阅读原文”,了解更多!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存