Pwanble.kr elf
复制本地路径 | 在线编辑
小趣事
Q: 一开始读取 Section Table 死活读不出,明明 baseaddr + e_shoff 就行了。
A: 这是可执行文件啊... 可执行文件对应读取的是 Segment Table,目标文件才是读取 Section Table..
整体思路
1. [ELF Header] --> 找到 [Program Header Table] 位置
2. [Program Header Table] --> 找到 [Dynamic Header Table] 位置
3. [Dynamic Table] --> 找到 [DT_DEBUG] 位置
4. [DT_DEBUG] --> 找到 [libflag.so 加载地址]
5. [libflag.so] --> 找到 libflag.so [Dynamic Header Table]
6. [Dynamic Header Table] --> 找到 [symtab] 和 [strtab]
7. [symtab] [strtab] --> 找到 [yes_ur_flag] 内容
具体逻辑
1. 这一步比较简单,都是固定的格式
2. 在 [Program Header Table] 中,是由各个表项组成的,也都是固定格式,找到 [Dynmaic] 就行
3. 在 [Dynmaic Table] 中,也是各个表项组成,也是固定格式,同样的有许多格式,比如 [DT_NEED] 表示这是需要依赖的文件,找到 [DT_DEBUG],获得了对应的地址
- https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-42444.html (Blog/CTF/Dynamic_Table)
4. [DT_DEBUG] 的地址指向的是 r_debug 这个结构体,通过它可以找到 link_map 这个结构体的位置,link_map 就是各个依赖文件项组成的链表,所以遍历这个链表,看看它的名称是不是 libflag.so,具体看下面细节
- https://rk700.github.io/2015/04/09/dt_debug-read/ (Blog/CTF/Debug)
5. 有了 libflag.so 基址,就可以找到 libflag.so 的 [Dynmaic Table],方法和上面找总体的 [Dynmaic Table] 一样
6. 之前是从 [Dynmaic Table] 中找 [DT_DEBUG],现在就找 [SYMTAB] 和 [STRTAB]
7. [SYMTAB] 就是符号表,各个函数细节就在这个里面,所以遍历这个符号表,内容看下面链接,每次遍历去 [STRTAB] 字符串表中看看是不是 yes_ur_flag,找到了就有了这个函数的起始地址,然后再把这个地址开始的内容泄露出来,里面有 flag ~