随笔-ELF的动态解析中,函数查找的必要条件

基本知识,.plt中前一半是jmp跳转.got.plt中存的地址。这个地址一开始是写plt表项中的后一半指令,即push id;jmp xx。这里的id是这个函数在plt中的顺序,一个二进制中是固定的用于指明要找谁。这个xx就是交由动态解析函数去找这个函数。

关于使用到的符号函数,可以用“readelf -r bin”读取.rela.dyn的信息查看;同样,可以用“objdump -tT lib”查看库的导出函数信息。细节可以参考:https://delcoding.github.io/2018/12/dl_runtime_resolve/

前面的结果中,名字如这样“atoi@GLIBC_2.2.5”,@前后的名字(f_name@lib_ver)都得对应上,才会返回lib中的函数地址。检索的函数调用顺序是,_dl_runtime_resolve ➡ _dl_fixup ➡  _dl_lookup_symbol_x。最后一个的函数参数是比较好作为分析点查看的,参数如下:

_dl_lookup_symbol_x (strtab + sym->st_name, l, &sym, l->l_scope,version, ELF_RTYPE_CLASS_PLT, flags, NULL);

第一个参数是函数名,version参数的第一个成员是str指针指向lib名。该函数实现参考源码:https://github.com/lattera/glibc/blob/master/elf/dl-runtime.c

所以,如果要改patch一个程序,这个lib_ver也要改。这个位置在我的分析中,在Elf64_Sym数组的后面,紧挨着表示lib_ver的字符串数组后面,是以idex的形式存在的。lib_ver字符串数组,一般来说,第一个是“__gmon_start__”,第二个是“GLIBC_xxxx"。建议对照源码,从_dl_lookup_symbol_x往前回溯几个调试,就非常清楚在什么位置了。

 

这个坑踩了一天,特此记录。

你可能感兴趣的:(随笔-ELF的动态解析中,函数查找的必要条件)