• 第三章 Linux目标文件解析


    解析目标文件内容:举例说明

    1. //root@ubuntu:/mnt/hgfs/share/019-proself/04# cat simplesection.c
    2. int printf(const char* format,...);
    3. int global_init_var=84;
    4. int global_uninit_val;
    5. void func1(int i)
    6. {
    7. printf("%d\n",i);
    8. }
    9. int main(void)
    10. {
    11. static int static_var = 85;
    12. static int static_var2;
    13. int a=1;
    14. int b;
    15. func1(static_var + static_var2 + a + b);
    16. return a;
    17. }

    1、文件格式有哪些?

     2、ELF文件类型有几种类型?

    (1)可重定位文件.o

    (2)可执行文件

    (3)共享目标文件

    (4)核心转储文件(Linux下的core dump文件)

    3、如何查看文件类型---file命令

    4、目标文件的基本框架

    (1)虚拟空间的映射关系

    (2)objdump -h 查看文件总共的段以及偏移

     注意:bss段并不占文件的空间。

     

     (3)接下来分析代码段

    从objdump -h查看文件段空间知道,text的偏移和大小,

    objdump -s 查看段内容

    objdump -d 查看段反汇编

     (4)数据段

    ①.data段存放了初始化的全局变量和局部静态变量。

    ②printf的时候用到了字符串常量“%d\n”,存放在.rodata

    ③小端存储0x54

    ④强符号和弱符号概念

     (5)bss段

    存放未初始化的全局变量和局部静态变量。准确的将是.bss段为他们预留空间。我们只能通过符号表查看,使用objdump -s打印所有段的内容无法查看,以为不在文件中存放。

    问题:从代码来看bss,应该有3个整形数

     

     (7)常见的其他短分析

    1. root@ubuntu:/mnt/hgfs/share/019-proself/04# objdump -h /bin/ls
    2. /bin/ls: file format elf32-i386
    3. Sections:
    4. Idx Name Size VMA LMA File off Algn
    5. 0 .interp 00000013 08048154 08048154 00000154 2**0
    6. CONTENTS, ALLOC, LOAD, READONLY, DATA
    7. 1 .note.ABI-tag 00000020 08048168 08048168 00000168 2**2
    8. CONTENTS, ALLOC, LOAD, READONLY, DATA
    9. 2 .note.gnu.build-id 00000024 08048188 08048188 00000188 2**2
    10. CONTENTS, ALLOC, LOAD, READONLY, DATA
    11. 3 .gnu.hash 0000006c 080481ac 080481ac 000001ac 2**2
    12. CONTENTS, ALLOC, LOAD, READONLY, DATA
    13. 4 .dynsym 00000820 08048218 08048218 00000218 2**2
    14. CONTENTS, ALLOC, LOAD, READONLY, DATA
    15. 5 .dynstr 000005d5 08048a38 08048a38 00000a38 2**0
    16. CONTENTS, ALLOC, LOAD, READONLY, DATA
    17. 6 .gnu.version 00000104 0804900e 0804900e 0000100e 2**1
    18. CONTENTS, ALLOC, LOAD, READONLY, DATA
    19. 7 .gnu.version_r 000000c0 08049114 08049114 00001114 2**2
    20. CONTENTS, ALLOC, LOAD, READONLY, DATA
    21. 8 .rel.dyn 00000038 080491d4 080491d4 000011d4 2**2
    22. CONTENTS, ALLOC, LOAD, READONLY, DATA
    23. 9 .rel.plt 00000380 0804920c 0804920c 0000120c 2**2
    24. CONTENTS, ALLOC, LOAD, READONLY, DATA
    25. 10 .init 00000023 0804958c 0804958c 0000158c 2**2
    26. CONTENTS, ALLOC, LOAD, READONLY, CODE
    27. 11 .plt 00000710 080495b0 080495b0 000015b0 2**4
    28. CONTENTS, ALLOC, LOAD, READONLY, CODE
    29. 12 .text 0001078c 08049cc0 08049cc0 00001cc0 2**4
    30. CONTENTS, ALLOC, LOAD, READONLY, CODE
    31. 13 .fini 00000014 0805a44c 0805a44c 0001244c 2**2
    32. CONTENTS, ALLOC, LOAD, READONLY, CODE
    33. 14 .rodata 000040a8 0805a460 0805a460 00012460 2**5
    34. CONTENTS, ALLOC, LOAD, READONLY, DATA
    35. 15 .eh_frame_hdr 00000744 0805e508 0805e508 00016508 2**2
    36. CONTENTS, ALLOC, LOAD, READONLY, DATA
    37. 16 .eh_frame 00002f34 0805ec4c 0805ec4c 00016c4c 2**2
    38. CONTENTS, ALLOC, LOAD, READONLY, DATA
    39. 17 .init_array 00000004 08062ef8 08062ef8 00019ef8 2**2
    40. CONTENTS, ALLOC, LOAD, DATA
    41. 18 .fini_array 00000004 08062efc 08062efc 00019efc 2**2
    42. CONTENTS, ALLOC, LOAD, DATA
    43. 19 .jcr 00000004 08062f00 08062f00 00019f00 2**2
    44. CONTENTS, ALLOC, LOAD, DATA
    45. 20 .dynamic 000000f8 08062f04 08062f04 00019f04 2**2
    46. CONTENTS, ALLOC, LOAD, DATA
    47. 21 .got 00000004 08062ffc 08062ffc 00019ffc 2**2
    48. CONTENTS, ALLOC, LOAD, DATA
    49. 22 .got.plt 000001cc 08063000 08063000 0001a000 2**2
    50. CONTENTS, ALLOC, LOAD, DATA
    51. 23 .data 00000160 080631e0 080631e0 0001a1e0 2**5
    52. CONTENTS, ALLOC, LOAD, DATA
    53. 24 .bss 00000c54 08063340 08063340 0001a340 2**5
    54. ALLOC
    55. 25 .gnu_debuglink 00000008 00000000 00000000 0001a340 2**0
    56. CONTENTS, READONLY

    5、为什么需要把数据段和指令分开存放?

    (1)权限问题,代码段只读

    (2)现代cpu缓存有数据缓存和指令缓存

    (3)为了实现多进程共享指令和共享数据

    6、反过来分析elf的文件头

    ELF头定义的结构体: 

     

     

     7、分析段表

    ①利用readelf -S 查看段表

    ②段的类型 

     8、重定位

    对于每一个需要重定位的代码段和数据段,都需要一个对应的重定位表。因为text中使用了printf函数,需要访问绝对地址。而.data中,没有绝对地址的引用,它只包含了几个常量。

     

     9、字符串表

  • 相关阅读:
    6.2. 吴恩达机器学习-Kmeans
    随手记面试录
    设置小于浏览器默认字体大小的显示方法
    《Mycat分布式数据库架构》之故障切换
    HTML+CSS+JavaScript七夕情人节表白网页【樱花雨3D相册】超好看
    Linux 基础-查看和设置环境变量
    [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
    spring boot 一个极简单的 demo 示例
    antd table给某些表头设置样式
    聊聊自制的探索大全扑克牌
  • 原文地址:https://blog.csdn.net/LuckyDog0623/article/details/120805569