ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-在ELF文件中找到全局偏移表

2019-10-27 20:50:31  阅读:211  来源: 互联网

标签:elf linux c-4


我如何在要解析的ELF文件中找到.got节的偏移量?

我不想按名称搜索该部分,因为我不想依赖它.当我用其他方式更改节名称时,二进制文件仍然有效.

解决方法:

简短的答案:一般情况下,您不能这样做.

链接视图中的GOT

该过程的链接视图由节标题表给出.可以通过以下方式找到GOT:

$readelf -S $elf
[...]
Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [29] .got              PROGBITS         00000000003a2d80  001a2d80
       0000000000000278  0000000000000008  WA       0     0     8
  [30] .got.plt          PROGBITS         00000000003a3000  001a3000
       0000000000000078  0000000000000008  WA       0     0     8

由于部分名称(实际上可能是任何东西),您只能识别GOT. GOT条目正在使用SHT_PROGBITS(与ELF文件的许多其他位一样),因此您不能使用节类型来识别它们.

而且,节标题表在运行时不需要,并且不需要出现在ELF文件中.

执行视图

我们可以改用执行视图吗?

执行视图由程序头表给出.但是,在程序头表中,没有(非PLT)GOT的真实概念.运行时并不关心GOT条目的位置.它们也可以分散在数据段中的任何位置*.重要的是(运行时)重定位表中存在正确的重定位.

使用动态部分

需要告知动态链接器PLT GOT条目(.got.plt)在哪里.这由动态部分的DT_PLTGOT条目给出.但是,它仅给出GOT PLT表开头的(运行时,虚拟内存)位置:您没有它的大小.

使用重定位表

您可以尝试检查重定位表:

>您应该能够通过查看PLT重定位来推断PLT GOT的大小;
>您可以通过查看非PLT重定位来推断非PLT GOT的位置和大小.

如果查看libc的非PLT重定位表(在x86_64上),则会得到一堆R_X86_64_GLOB_DAT条目:

$readelf -r $elf
[...]
0000003a2da0  052c00000006 R_X86_64_GLOB_DAT 00000000003a4708 stderr + 0
0000003a2da8  061400000006 R_X86_64_GLOB_DAT 00000000003a85d0 error_one_per_line + 0
0000003a2db0  06eb00000006 R_X86_64_GLOB_DAT 00000000003a57d0 __malloc_initialize_ho + 0
0000003a2db8  07f300000006 R_X86_64_GLOB_DAT 00000000003a4720 __morecore + 0
0000003a2dc8  02a400000006 R_X86_64_GLOB_DAT 00000000003a8998 __key_encryptsession_p + 0
0000003a2dd0  061000000006 R_X86_64_GLOB_DAT 00000000003a3ec8 __progname_full + 0
0000003a2dd8  049c00000006 R_X86_64_GLOB_DAT 00000000003a4010 __ctype32_tolower + 0
0000003a2de0  011900000006 R_X86_64_GLOB_DAT 00000000003a5fb8 _environ + 0
0000003a2de8  000300000006 R_X86_64_GLOB_DAT 0000000000000000 _rtld_global + 0
0000003a2df0  011000000006 R_X86_64_GLOB_DAT 00000000003a3ec0 __progname + 0
0000003a2df8  04ff00000006 R_X86_64_GLOB_DAT 00000000003a32c4 argp_err_exit_status + 0
0000003a2e08  04ce00000006 R_X86_64_GLOB_DAT 00000000003a8538 mallwatch + 0
0000003a2e10  00bc00000006 R_X86_64_GLOB_DAT 00000000003a87d8 __rcmd_errstr + 0
0000003a2e18  056400000006 R_X86_64_GLOB_DAT 00000000003a48e0 __vdso_clock_gettime + 0
[...]

我们几乎找到了非PLT GOT的地址:

$readelf -S $elf
[...]
  [29] .got              PROGBITS         00000000003a2d80  001a2d80
       0000000000000278  0000000000000008  WA       0     0     8

缺少4个GOT条目(我不知道为什么……).

注意

(*):这意味着甚至可能没有任何(非PLT)GOT.

标签:elf,linux,c-4
来源: https://codeday.me/bug/20191027/1947457.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有