在Linux中,程序使用_dl_runtime_resolve(link_map,reloc_offset)来对动态链接的函数进行重定位。
而ret2dlresolve攻击的核心就是控制相应的参数及其对应地址的内容,从而控制解析的函数。
程序想要调用其它动态链接库的函数时必须在加载的过程中动态链接,而动态链接将函数地址统一储存在一个表中,windows下这个表叫IAT表,Linux下叫做GOT表。
在调用库函数时会有个call [xxx]或jmp [xxx],而这里的xxx就是IAT或者GOT表中的函数地址。
Dynamic Sections - CTF Wiki (ctf-wiki.org)这里贴一下ctfwiki里对dynamic的介绍,方便后面做题
这个section的用处就是他包含了很多动态链接所需的关键信息,我们现在只关心DT_STRTAB, DT_SYMTAB, DT_JMPREL这三项,这三个东西分别包含了指向.dynstr, .dynsym, .rel.plt这3个section的指针
一个字符串表,index为0的地方永远是0,然后后面是动态链接所需的字符串,0结尾,包括导入函数名,用的是相对这个section头的偏移
这个东西,是一个符号表(结构体数组),里面记录了各种符号的信息,每个结构体对应一个符号。
link_map访问.dynamic,取出.dynstr, .dynsym, .rel.plt的指针.rel.plt + 第二个参数求出当前函数的重定位表项Elf32_Rel的指针,记作relrel->r_info >> 8作为.dynsym的下标,求出当前函数的符号表项Elf32_Sym的指针,记作sym.dynstr + sym->st_name得出符号名字符串指针rel->r_offset,即GOT表