
ELF
文章平均质量分 90
ELF解析01 - ELF头和程序头
ELF解析02 - linker
ELF解析03 - 加载段
ELF04
ELF解析05 - hash表
二手的程序员
这个作者很懒,什么都没留下…
展开
-
ELF解析06 - 入口参数与傀儡进程
04 里面的重定位表没讲完,这里继续,我们说过重定位的类型有很多,04 里面基本只介绍了一种,就是 plt 表。重定位不仅仅发生在代码里面,还会发生在数据里面,比如so程序里面对一些全局变量的引用,它们的重定位信息是放在另外一个表里面:对应 section 的:里面的结构体与 rela.plt 的结构体是一样的。以第一项为例:0x05D690 表示符号地址。0x0403 表示符号重定位类型。由于它不属于符号表,所以索引为0。所以,我们只需要在这个位置按照上面的方式计算好地址填进去就行。原创 2024-01-18 11:21:21 · 514 阅读 · 0 评论 -
ELF解析05 - hash表
这个表叫 hash 表,它的作用是用于快速索引符号在符号表中的位置。先看一张图:查找一个符号的位置步骤如下:首先,计算出符号字符串的 hash 值然后,根据 hash 值获取 bucket 索引 indexbucket[index] 里面储存的是符号表的 index,但是由于 hash 冲突问题,所以又建立了一个 chain 来当链表结构。chain 里面储存的是符号的 hash 值,但是只使用了前 31 位,后 1 位是用于表示该链表是否结束,。原创 2024-01-17 10:21:44 · 1646 阅读 · 0 评论 -
ELF解析04 - 字符串表/导入库表/符号表/导入表
本文主要讨论 里面的几个子表。我们先总体看下 :这里我们只需要关心图中两个画圆圈的地方。由于 的子表内容都在可加载段的范围里面,所以对这些子表的访问都是在虚拟内存里面进行的。 这个值我们可以自己静态分析使用,但是解析的时候不要用这个地址。包括 ,这些值都没用。有一个需要注意的地方,就是 的值要比 的值要大一个 PAGE 值。这是为啥呢?是因为第二个可加载段的映射偏差:可以看到在第二个可加载段在做内存映射的时候就有一个 PAGE 值的偏差,由于只要是放在第二个段里面的内容,就会有一个 PAGE 的原创 2024-01-12 09:52:11 · 1421 阅读 · 0 评论 -
ELF解析03 - 加载段
本文主要讨论 mmap 函数以及如何使用 mmap 函数来加载一个 ELF 的可加载段。原创 2024-01-12 09:38:43 · 1082 阅读 · 0 评论 -
ELF解析02 - linker
01里面,我们看到了修改后的 ls 程序在 maps 里面的布局:在 01 里面,我们说到,r—p 这个段是一个 padding 段,但是实际上不是的。这个显然是对应的:这个段的权限标志是r--,这个与010中两个可加载段都不匹配,这是为啥呢?其实,这个段是010中第二个可加载段的一部分,只不过它的权限被修改了。是被下面这个段修改的:这个段描述的就是,在 elf 被重定位之后,将虚拟位置 5D660 且大小为 10656 字节的区域的权限改成只读的。我们算一下:且由于4kb对齐,所以。原创 2024-01-05 15:42:52 · 1111 阅读 · 0 评论 -
ELF解析01 - ELF头和程序头
我们可以做一个实验,将 section header 部分全部使用 EE 覆盖,push 到手机上,是依然可以运行的。覆盖完之后,将该程序使用 ida 打开,发现 ida 根本解析不了,这是因为 IDA 是依靠 section 来解析的。实际上加载一个 so 文件的时候,ida 的 segment view 里面就是解析的 section header。原创 2023-12-29 12:04:35 · 1166 阅读 · 0 评论