1. ELF文件结构初探
ELF(Executable and Linkable Format)是Linux系统中最常见的可执行文件格式,也是CTF逆向题目中最常遇到的格式类型。刚接触逆向工程时,很多人会被一堆十六进制数字和结构体定义吓到,其实ELF文件就像一本书,有封面、目录、章节内容,只要掌握阅读方法就能轻松理解。
我先拿最简单的Hello World程序来举例。用C写个hello.c,编译后得到a.out,这就是最简单的ELF文件。用readelf命令看看它的结构:
readelf -h a.out
输出结果会显示ELF文件头信息,包含魔数、文件类型、指令集架构等关键信息。魔数7f 45 4c 46就是ELF的签名,相当于书的"ELF"标识。接下来看到的是32/64位标识,小端序排列,这些基础信息能帮你快速判断文件的基本属性。
ELF文件头就像书的封面,告诉你这本书的基本信息:多少页(文件大小),章节从哪开始(程序头表偏移),附录从哪开始(节头表偏移)。我刚开始学的时候特别喜欢用计算器验证这些数值,比如用节头表偏移加上节头数量乘以每个节头大小,果然能得到文件总大小,这种实操验证特别有成就感。
2. 程序头与节头详解
程序头(Program Header)和节头(Section Header)是ELF文件中两个最重要的概念,但初学者经常搞混。简单来说,程序头是给操作系统看的,告诉系统如何加载和执行程序;节头是给编译器看的,记录代码和数据如何组织。
程序头表定义了 segments,这些segments在程序加载时会被映射到内存中。用readelf查看程序头:
readelf -l a.out
你会看到多个程序头,比如LOAD类型表示需要加载到内存的段,INTERP指定动态链接器路径。我记得第一次看到GNU_STACK段时很疑惑,后来才知道这是控制栈是否可执行的,现在的Linux默认都设置栈不可执行,这是安全加


1634

被折叠的 条评论
为什么被折叠?



