这些天整理笔记,整理到 ELF 格式的时候,内心总是:这是我的笔记吗?我怎么会这么记笔记?又翻了一下虫神的 ELF 文件格式示意图,依旧一脑袋浆糊,所以打算从文件构造的角度理解 ELF 格式。
考虑一般 ELF 文件 我感觉要明白一个思维,计算机中存储的都是数据,无论是地址还是值,无论是简单类型还是复杂结构,总要有方法进行管理、访问、控制
首先,能很容易明白的是,ELF 可执行文件它是分 Section 的 每一种 Section 都有着不同的用处,其中比较重要的就是
暂且不考虑这些 Section 的细节,接下来能想到的是既然有 Section,计算机如何才能找到对应的 Section
那么就需要告诉计算机相应 Section 的完整属性,比如:
这些属性合并在一起,代表着这个 Section,所以起了个名字叫 Section Header 举个不恰当的例子,你要想去公司里找特定部门谈生意,那你肯定的知道部门的名称,在公司的哪栋楼,多少人,能谈什么生意,谈生意的规则...
一个公司也不止一个部门,一个 ELF 文件也不止一个 Section,有时需要多找几个,怎么快速发现呢?此时,计算机的常见思维出现了,我需要找个管理来整合这些资料,是的,没错,将这些数据整合成表,变成了 Section Header Tables
现在有了 Section Header Tables,计算机就能够通过它访问各种数据,但是问题来了,对于 Section 来说,像类型、flag,size 等信息都能在相似的数据类型下良好的定义,名字该怎么半?名称的长短伸缩性不小,而且有些通用性并不高,如:
如果不管不顾,那这个 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
参考资料: 程序员的修养 CTF_all_in_one (再次膜拜大佬
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课