应用安全 --- 应知应会 之 ELF文件节区
ELF 常见节区及其作用
| 节区名称 (Section Name) | 作用简介 | 通俗易懂的举例 |
|---|---|---|
.text |
代码段。存储程序的所有可执行指令(编译后的机器代码)。 | 就像一本烹饪书的操作步骤部分(“第一步:打蛋;第二步:搅拌...”)。 |
.data |
已初始化数据段。存储已初始化的全局变量和静态变量。 | 就像准备好了的预制食材(一碗已经量好的 100 克糖,一瓶已开封的牛奶)。 |
.bss |
未初始化数据段。存储未初始化的全局变量和静态变量,程序加载时系统会自动将它们初始化为零。 | 就像预先留出的空碗和空盘子(你知道需要它们,但使用前才会清洗干净并放入东西)。 |
.rodata |
只读数据段。存储常量和只读数据,如字符串字面量。 | 就像刻在石板上的固定食谱名称(“提拉米苏配方”)或警示语(“小心烫伤!”),无法修改。 |
.strtab |
字符串表。存储各种符号名称的字符串(如变量名、函数名)。 | 就像一份名称索引,记录了所有食材和工具的标准名称(“鸡蛋”、“电动搅拌器”)。 |
.symtab |
符号表。存储程序中定义的以及引用的符号信息(函数、变量),包括它们的名字、位置等。 | 就像一份全局地图,标注了所有厨房工具的位置(“打蛋器放在左上角第二个抽屉”)和外部商店的位置。 |
.shstrtab |
节区名称字符串表。存储所有节区名称的字符串(如 .text, .data 这些名字本身)。 |
就像一本书的目录页的标题(“第一章”、“附录”),它本身也是书的一部分。 |
.plt |
过程链接表。用于动态链接,是调用共享库(如 libc.so)中函数的跳板。 |
就像餐厅的前台电话。你想点外卖(调用外部函数),先打电话给前台(.plt),前台帮你去联系。 |
.got / .got.plt |
全局偏移表。也用于动态链接,存储外部函数和变量的实际地址。.plt 通过查这张表来跳转。 |
就像前台的外卖电话速拨表。前台(.plt)接到你的电话后,查这个表(.got.plt)找到披萨店的真正电话号码并进行拨打。 |
.dynamic |
动态信息段。存储了动态链接器所需的各种信息,如依赖哪些共享库、符号表地址等。 | 就像一份动态链接说明书,告诉系统这个程序需要哪些外部组件(面粉、鸡蛋供应商)以及如何找到它们。 |
.init |
初始化代码段。存储程序初始化时自动执行的代码(在 main 函数之前)。 |
就像做菜前预热烤箱的自动程序,不需要你手动操作,但必须执行。 |
.fini |
终止代码段。存储程序结束时自动执行的代码(在 main 函数之后)。 |
就像做完菜后自动关闭烤箱并发出提示音的程序。 |
.init_array / .fini_array |
构造函数数组 / 析构函数数组。存储一系列在 main 之前/之后执行的函数指针(C++ 全局对象构造/析构)。 |
就像一份在开餐前必须按顺序完成的准备工作清单(“1. 铺桌布,2. 摆餐具...”)和餐后清理工作清单(“1. 洗碗,2. 擦桌子...”)。 |
.rel.dyn / .rel.plt |
重定位表。包含需要被链接器修改(重定位)的地址信息,用于修正代码和数据中的绝对地址。 | 就像一份地址更新清单。你搬家后(程序被加载到新地址),邮局(链接器)根据这个清单更新所有寄往你旧地址的信件(指令中的地址)上的地址标签。 |
.eh_frame / .eh_frame_hdr |
异常处理帧信息。存储如何展开调用栈的信息,用于 C++ 异常处理和调试。 | 就像火灾时的紧急疏散图,清晰地标明了安全出口和逃生路线(如何从当前函数一步步返回到上级函数)。 |
.gcc_except_table |
GCC 异常表。与 .eh_frame 配合,定义了哪些代码区域处理哪些类型的异常。 |
就像疏散图上标注的不同灾害类型(火、地震)对应的不同逃生方案。 |
.comment |
注释信息段。存储编译器的版本信息等注释内容。 | 就像书中的版权页,写着“本书由 XXX 出版社于 YYYY 年出版”。 |
.debug_* |
调试信息段(如 .debug_info, .debug_line)。存储丰富的调试信息,只有调试版本的程序才有。 |
就像一份极其详细的厨师工作日志,记录了每一步操作的原因、用时、甚至当时的心情(仅供调试使用,会显著增大文件体积)。 |
总结一下记忆技巧:
-
执行:看
.text -
数据:
-
有值的→
.data -
没值的 →
.bss -
不能改的 →
.rodata
-
-
导入的函数:
.plt(打电话) +.got(查号码) -
辅助信息:
-
起名字用的 →
.strtab,.symtab -
定规矩用的 →
.dynamic -
处理异常的 →
.eh_frame -
初始化收尾 →
.init,.fini,.init_array
-
浙公网安备 33010602011771号