惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
Jina AI
Jina AI
博客园 - 司徒正美
雷峰网
雷峰网
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
I
InfoQ
博客园 - Franky
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
Cyberwarzone
Cyberwarzone
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security
P
Privacy & Cybersecurity Law Blog
T
Threatpost
Cloudbric
Cloudbric
D
Docker
M
MIT News - Artificial intelligence
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Vercel News
Vercel News
Martin Fowler
Martin Fowler
J
Java Code Geeks
AWS News Blog
AWS News Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
L
Lohrmann on Cybersecurity
Hacker News: Ask HN
Hacker News: Ask HN
Last Week in AI
Last Week in AI
S
Security @ Cisco Blogs
Help Net Security
Help Net Security
C
Cisco Blogs
V
V2EX
博客园 - 【当耐特】
I
Intezer
爱范儿
爱范儿
F
Fortinet All Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Privacy International News Feed
IT之家
IT之家
L
LINUX DO - 最新话题
B
Blog RSS Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - GKLBB

软件研发 --- AI模型 之 图片转xlsx 软件神器 --- ctf靶场 之 pwn.college 术语俗话 --- 什么是加密狗 软件神器 --- 自动电脑锁屏软件 软件研发 --- 网络安全 之 putty生成无密码登录密钥 软件神器 --- 视频剪辑 之 Avidemux MP4Joiner Shotcut 软件神器 --- 视频格式转化 之 handbrake 软件研发 --- 经验之谈 这个是什么图标,经常看到 软件研发 --- 术语俗话 之 多模态 术语俗话 --- 什么是大数据开发 软件研发 --- 术语俗话 之 什么是边缘计算 软件研发 --- 应知应会 之 什么是云计算开发 应知应会 --- 如何不装软件查看网速 常见问题解决 --- 360拦截接触 常见问题解决 --- 加入会议摄像头无法打开 网络安全 --- CTF打靶 之 ZIP伪加密 → Robot36慢扫电视 → 二维码补齐 → DeepSound隐写 → GPG解密 → Base64图片 → SilentEye隐写 软件研发 --- 应知应会 之 无错误的闪退如何解决 软件研发 --- 应知应会 之 为什么别人的软件如此复杂我的如此简单 网络安全 --- 应知应会 之 什么是旁站 应知应会 --- 如何查询备案 软件神器 --- 格式转化 之 jpg 2 svg 网络安全 --- CTF打靶 之 flag搜索 软件神器 --- 互联网测速 之 软件神器 --- 局域网测速 之 iperf 常见问题解决 --- 模拟器USG6000打开后,启动设备失败,错误40 软件研发 --- AI网络 之 ensp配置生成 软件研发 --- AI编程 之 极简流程 软件研发 --- AI生图产品比较 常见问题解答 --- 为什么我的服务一直被人DDOS 软件研发 --- 开发万能格式转化工具 网站神器 --- 在线格式转化 之 文档转md 术语俗话 --- 什么是云电脑 常见问题解决 --- 如何在没有安装杀毒软件的情况下知道这个文件是不是牧马 常见问题解决 --- Win10下VMware 17安装VMware Tools选项灰色/失效解决办法 常见问题解决 --- 云电脑报错 :PAGE FAULT IN NONPAGED AREA 记一次牧马的发现 人生感悟 --- 为什么我们生活中同一件事有多个品牌,他们到底有什么区别 软件运维 --- 云电脑安装打印机 常见问题解决 --- 网络打印默认端口 常见问题解决 --- 京瓷打印云电脑无法设置双面打印 软件研发 --- 网络安全 之 brupsuite如何设置上游袋里 术语俗话 --- 什么是同步和异步 我的目标 软件研发 --- dify配置 之 markword转word带有简单样式的方法 软件研发 --- 接口文档格式 常见问题 --- dify 的 deepseek是旧模型版本 OWASP 非营利性开源社区 计算机标准化组织 术语俗话 --- POSIX 就是 Unix 世界的"普通话",大家说同一种语言就能互相理解。 我的数字生活唯一选择 软件开发 --- 安卓开发 之 命名空间隔离 术语俗话 --- 页面对齐、 跨页 计算机的哪些人 --- 社交之王 马克·扎克伯格 计算机的哪些人 --- 重新定义新能源 之 埃隆·马斯克 软件研发 --- AI生成ppt word excel pdf的开发关键 软件研发 --- AI应用开发 之 AI生成Word 人生感悟 --- 致可悲的人 软件研发 --- pdf 表格图片 转 excel 常见问题解决 --- 装有系统的固态硬盘错误 人生感悟 --- 什么是行业黑话 术语俗话 --- Kubernetes 术语俗话 --- 什么是DBI,和hook什么区别 答疑解惑 --- 为什么苹果手机电池不允许拆卸 代码可视化技术 术语俗话 --- Wrap 函数 人生感悟 --- 逆向工程为什么十分枯燥且无聊 --- 这里引用一句逆向工程核心原理的话 人生感悟 --- 为什么干活时不见同事,活干完了就来了 软件研发 --- AI应用研发 之 提炼提示词 软件研发 --- AI应用开发 之 AI生成PPT最佳方案 基于屏幕-摄像头的单向数据传输方案设计 俗语俗话 --- 纯虚函数 硬件研发 --- 产品介绍 之 AX6 硬件研发 --- 产品大全 之 SUMAVISION CM50X 应知应会 --- 为什么U盘不识别但是还是可以数据恢复回来 应知应会 --- 为什么我删除了一个文件但是还是可以恢复回来 软件研发 --- AI UI设计 之 PC端效果比对 常见问题修复 --- chrome浏览器白屏 应用安全 --- 逆向工程 之 C++类的本质 软件研发 --- AI提示词开发 之 代码注释提示词 dobby反编译 https://www.cnblogs.com/Un1corn/p/18615567 应知应会 --- 手机作为热点,windows电脑临时作为网关,给其他电脑上网 应知应会 --- 大量小文件如何快速迁移 常见问题解决 --- apk安装过程中闪退 应用安全 --- 安卓逆向 之 dobby框架 在线生成 APK 图标工具推荐 一个开源库 术语俗话 --- 什么是软件即服务 软件神器 --- 常用谷歌插件 应用安全 --- 逆向技巧 之 识别未知函数 人生感悟 --- 为什么两句话可以说明白的事情要500字说明 软件研发 --- Dify 生成 PPT 方案分析 应用安全 --- 逆向技巧 之 IDA未知函数如何识别 https://yuuki.cool/ 硬件研发 --- 接口 人生感悟 --- 为什么ld一直爱开会 应用安全 --- 逆向技巧 之 IDA和claude反编译缺陷 应用安全 --- 逆向技巧 之 ida反编译yahfa的so和源码的差异化比对
应用安全 --- 逆向技巧 之 ELF节(Section) 与 段(Segment)
GKLBB · 2026-04-07 · via 博客园 - GKLBB

一、节(Section) 详解表

.text 代码仓库 - 存放程序实际执行的机器指令,CPU直接从这里取指令执行 int add(int a, int b) { return a + b; } → 编译后的机器码放这里 .data 已初始化的全局变量仓库 - 存放有初始值的全局/静态变量 int g_val = 100; → 100这个值存在.data.bss 未初始化的全局变量仓库 - 只记录大小,不占磁盘空间,程序启动时清零 int g_arr[1000]; → 不占磁盘空间,只记录4000字节 .rodata 只读数据仓库 - 存放常量、字符串字面量,不可修改 printf("Hello World\n"); → "Hello World\n"放这里 .symtab 符号字典 - 记录所有函数名、变量名及其地址,链接时使用 int foo(); int bar = 1; → foo、bar的名字和地址记录在此 .strtab 字符串仓库 - 存放符号名称的字符串,配合.symtab使用 "main""printf""g_val" 等字符串存在这里 .shstrtab 节名仓库 - 存放所有节名称的字符串 ".text"".data"".bss" 等节名字符串 .rel.text / .rela.text 代码重定位表 - 记录代码中哪些地址需要在链接时修正 call printf → printf地址未知,记录需要修正的位置 .rel.data / .rela.data 数据重定位表 - 记录数据段中哪些地址需要链接时修正 int *p = &g_val; → g_val地址记录在重定位表 .dynsym 动态符号字典 - 运行时动态链接用的符号表(.symtab的子集) 共享库.so中导出的printf等函数信息 .dynstr 动态字符串仓库 - 动态符号对应的字符串,运行时使用 "printf""malloc" 等动态符号名 .plt 动态函数跳转桩 - 调用动态库函数的跳板,第一次调用时触发延迟绑定 call printf@plt → 先跳到PLT,PLT再找真实地址 .got 全局偏移表 - 存放全局变量的实际地址,位置无关代码通过它访问全局变量 mov rax, [rip + g_val@got] → 通过GOT找变量地址 .got.plt 函数地址表 - 配合PLT存放动态函数的实际地址,延迟绑定后更新 第一次调用printf后,这里存储printf的真实地址 .init 程序初始化代码 - main()之前执行的初始化逻辑 C++全局对象构造、__attribute__((constructor))函数 .fini 程序清理代码 - main()返回后执行的清理逻辑 C++全局对象析构、__attribute__((destructor))函数 .init_array 初始化函数指针数组 - 存放所有需要在main前调用的函数指针 __attribute__((constructor)) void init() {} → 函数指针存这里 .fini_array 清理函数指针数组 - 存放所有需要在main后调用的函数指针 __attribute__((destructor)) void cleanup() {}.ctors C++构造函数列表 - 全局C++对象的构造函数指针(旧式) MyClass g_obj; → MyClass::MyClass()的指针存这里 .dtors C++析构函数列表 - 全局C++对象的析构函数指针(旧式) MyClass g_obj; → MyClass::~MyClass()的指针存这里 .debug_info 调试信息 - DWARF格式的变量类型、行号等调试数据 gcc -g 编译后生成,gdb靠这个知道变量类型和名称 .eh_frame 异常处理框架 - C++异常处理和栈展开的元数据 try { throw 1; } catch(...) {} → 异常处理信息 .comment 注释信息 - 编译器版本等元数据,不影响运行 GCC: (Ubuntu 11.3.0) 11.3.0.interp 解释器路径 - 记录动态链接器路径 /lib64/ld-linux-x86-64.so.2.dynamic 动态链接信息 - 记录依赖的共享库、GOT/PLT位置等动态链接配置 NEEDED libm.so.6 → 告诉系统需要加载哪些.so.hash / .gnu.hash 符号哈希表 - 加速符号查找的哈希索引 动态链接时快速找到printf符号的位置 .note 附加说明信息 - ABI版本、构建ID等元数据 NT_GNU_BUILD_ID: 唯一标识这个二进制的hash值 .tdata 线程局部已初始化数据 - 每个线程独立的有初值变量 __thread int t_val = 42; → 每线程各有一份42.tbss 线程局部未初始化数据 - 每个线程独立的无初值变量 __thread int t_count; → 每线程各有一份,初始为0
节名称作用(通俗解释)代码示例

二、段(Segment/Program Header) 详解表

PT_LOAD 可加载段 最重要的段!操作系统根据它把文件内容加载到内存,有多个,分别对应只读区和读写区 .text + .rodata 或 .data + .bssPT_DYNAMIC 动态链接段 告诉动态链接器如何完成动态链接(依赖哪些库、GOT在哪里等) .dynamicPT_INTERP 解释器段 指定动态链接器的路径,内核加载程序时先找到链接器 .interpPT_NOTE 注释段 存放系统/工具所需的附加信息,不影响运行 .note.ABI-tag.note.gnu.build-idPT_PHDR 段头表段 描述Program Header Table自身在文件和内存中的位置 Program Header Table本身 PT_TLS 线程局部存储段 定义线程局部变量的模板,每个线程创建时复制一份 .tdata.tbssPT_GNU_STACK 栈属性段 标记程序栈是否可执行(现代程序栈不可执行,防止栈溢出攻击) 无实际内容,只有权限标志 PT_GNU_RELRO 只读重定位段 动态链接完成后,将这部分内存改为只读(安全加固) .got.dynamic.init_arrayPT_GNU_EH_FRAME 异常处理段 指向异常处理信息的位置,C++异常和栈展开使用 .eh_frame_hdrPT_SHLIB 保留段 历史保留类型,现代系统不使用 -
段类型(Type)通俗名称作用解释包含的典型节

三、节(Section) → 段(Segment) 映射关系表

text

【可执行文件典型映射】

┌─────────────────────────────────────────────┐
│           ELF文件 (磁盘上)                   │
│                                             │
│  节(Section)          段(Segment)           │
│  ─────────────────────────────────────────  │
│  .interp          ──► PT_INTERP             │
│  .interp          ──► PT_LOAD[0] (只读段)   │
│  .note            ──► PT_NOTE               │
│  .text            ──► PT_LOAD[0] (只读段)   │
│  .rodata          ──► PT_LOAD[0] (只读段)   │
│  .eh_frame_hdr    ──► PT_GNU_EH_FRAME       │
│  .eh_frame        ──► PT_LOAD[0] (只读段)   │
│  .init_array      ──► PT_LOAD[1] (读写段)   │
│  .fini_array      ──► PT_LOAD[1] (读写段)   │
│  .dynamic         ──► PT_DYNAMIC            │
│  .dynamic         ──► PT_LOAD[1] (读写段)   │
│  .got             ──► PT_GNU_RELRO          │
│  .got.plt         ──► PT_LOAD[1] (读写段)   │
│  .data            ──► PT_LOAD[1] (读写段)   │
│  .bss             ──► PT_LOAD[1] (读写段)   │
│  .tdata           ──► PT_TLS                │
│  .tbss            ──► PT_TLS                │
└─────────────────────────────────────────────┘
.textPT_LOAD[0]r-x (读+执行) 代码需要执行,不能写(防篡改) .rodataPT_LOAD[0]r-x 或 r-- 只读数据,不能修改 .interpPT_LOAD[0] + PT_INTERPr-- 解释器路径,只需读取 .eh_framePT_LOAD[0] + PT_GNU_EH_FRAMEr-- 异常处理信息,只读 .pltPT_LOAD[0]r-x PLT跳转代码,需要执行 .init / .finiPT_LOAD[0]r-x 初始化/清理代码,需要执行 .dataPT_LOAD[1]rw- (读+写) 全局变量需要读写 .bssPT_LOAD[1]rw- 全局变量需要读写 .got.pltPT_LOAD[1]rw- 延迟绑定需要运行时修改 .dynamicPT_LOAD[1] + PT_DYNAMICrw- 动态链接信息需要读写 .init_arrayPT_LOAD[1] + PT_GNU_RELROrw-r-- 链接后变只读(安全) .gotPT_LOAD[1] + PT_GNU_RELROrw-r-- 链接后变只读(安全) .tdataPT_LOAD[1] + PT_TLSrw- 线程局部变量需要读写 .tbssPT_TLSrw- 线程局部变量需要读写 .symtab 无段映射 不加载 仅用于链接和调试,不需加载到内存 .strtab 无段映射 不加载 仅用于链接和调试 .debug_* 无段映射 不加载 仅调试器使用,不加载到内存
节名称所属段(Segment)内存权限原因说明

四、完整示意图

text

磁盘文件                          内存布局
─────────────────────────────────────────────────────────
ELF Header
Program Headers
                                 ┌──────────────────────┐
.interp    ┐                     │  只读可执行段          │
.text      │  PT_LOAD[0]  ──►   │  (r-x)               │
.plt       │  r-x                │  .interp              │
.rodata    │                     │  .text / .plt         │
.eh_frame  ┘                     │  .rodata / .eh_frame  │
                                 └──────────────────────┘
                                 ┌──────────────────────┐
.init_array ┐                    │  读写数据段            │
.fini_array │                    │  (rw-)               │
.dynamic    │  PT_LOAD[1]  ──►  │  .init_array (→只读)  │
.got        │  rw-               │  .got        (→只读)  │
.got.plt    │                    │  .dynamic             │
.data       │                    │  .got.plt             │
.bss        ┘                    │  .data / .bss         │
                                 └──────────────────────┘
Section Headers
.symtab                          (不加载到内存)
.strtab                          (不加载到内存)  
.debug_info                      (不加载到内存)

五、快速验证命令

Bash

# 查看所有节
readelf -S ./a.out

# 查看所有段
readelf -l ./a.out

# 查看节和段的映射关系(最直观!)
readelf -l ./a.out
# 输出中 "Section to Segment mapping" 部分就是映射关系

# 查看符号表
readelf -s ./a.out

# 查看动态链接信息
readelf -d ./a.out

text

# readelf -l 输出示例:
Section to Segment mapping:
  Segment Sections...
   00     .interp
   01     .interp .note .text .rodata .eh_frame   ← PT_LOAD[0]
   02     .init_array .fini_array .dynamic .got .data .bss  ← PT_LOAD[1]
   03     .dynamic                                 ← PT_DYNAMIC
   04     .note                                    ← PT_NOTE
   05     .eh_frame_hdr                            ← PT_GNU_EH_FRAME
   06                                              ← PT_GNU_STACK
   07     .init_array .fini_array .dynamic .got    ← PT_GNU_RELRO

免责声明 本文档所有内容仅供安全研究、学术交流与技术学习使用,严禁用于任何未经授权的逆向破解、网络攻击、隐私窃取、恶意软件开发及其他违反《中华人民共和国网络安全法》《数据安全法》等法律法规的行为,使用者应确保已获得目标软件权利人的合法授权并自行承担因使用本文档内容所产生的一切法律责任与后果,作者不对任何直接或间接损害承担任何责任,继续阅读即视为您已知悉并同意上述全部条款。