《Linux及安全》实践3.1
《Linux及安全》实践三 ELF格式文件分析
一、基础操作
1.查看大小端、32还是64



由此可以看出,本人实践所用到的是32位Ubuntu,数据存储采用小端法。
2.编写hello.c文件
3.查看文件类型、大小

可以看到是可重定位文件,大小为1028比特
4.以16进制形式输出hello.o文件
5.通过ELF headers table阅读文件各个段的信息



可以看到,Size of this header(文件头部)52bytes
二、ELF文件格式分析
1.查看ELF头部定义
- ELF头部的定义在/usr/include/elf.h中:

- (为不同位数设置)

- (ELF头结构体定义)
2.分析hello 的ELF头部
- 已知头部大小52字节

0000000 457f 464c 0101 0001 0000 0000 0000 0000
0000010 0002 0003 0001 0000 8320 0804 0034 0000
0000020 1174 0000 0000 0000 0034 0020 0009 0028
0000030 001e 001b
第一行分析:
- 其前16个字节(第一行,对应e_ident[EI_NIDENT])实际表示内容为7f45 4c46 0101 0100 0000 0000 0000 0000,前四个字节7f454c46(0x45,0x4c,0x46是'e','l','f'对应的ascii编码)是一个魔数(magic number),表示这是一个ELF对象。接下来的一个字节01表示是一个32位对象,接下来的一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0。
第二行分析:
- e_type(两个字节)值为0x0002,表示可执行文件。
- e_machine(两个字节)值为0x0003,表示是intel80386处理器体系结构。
- e_version(四个字节)值为0x00000001,表示是当前版本。
- e_entry(四个字节)值为0x83200804,表示程序进入点。
- e_phoff(四个字节)值为0x00340000,表示结头表偏移量。
第三行分析:
- e_shoff(四个字节)值为0x1174,表示段表的偏移地址。
- e_flags(四个字节)值为0x00000000,表示未知处理器特定标志(#define EF_SH_UNKNOWN 0x0)。
- e_ehsize(两个字节)值为0034,表示elf文件头大小(正好是52个字节)。
- e_phentsize(两个字节)为0x0020,表示程序头表中每个条目的大小为32.
- e_ehentsize(两个字节)值为0x0028表示段头大小为40个字节。
- e_shnum(两个字节)值为0x001e,表示段表入口有28个。e_shstrndx(两个字节)值为0x001b,表示段名串表的在段表中的索引号为27。
3.分析hello.o的section header table


由上图可见,section header table中包括了各段的偏移地址(off)和大小(size),可以由此找到各段的位置。
4.分析各段
.text段分析
- Hello.o中.text大小为0X1c,即十进制的28。
- 对hello.o进行反汇编

可以看到.text段跨越0x0到0x1b,恰好共0x1c(即28)个字节
.strtab段分析

该段的offset是0x3d8(正好在.symtab段之后),size是0x13,即到0x2ea为止。
对应字符串为:“\0hello.c\0main\0puts\0”
.symtab段分析


- 上图是.symtab所拥有的入口数量

从上面的分析已经知道,.symtab的偏移量为0x328(即808),大小为0xb0(即十进制176)。因而数据即上图中标为黄色的部分

该结构大小为16个字节,而整个符号表段大小为176个字节,所以总共可以分成11个符号。

这11个符号刚好和前面objdump输出的符号表(10个符号,第一个符号为空,所以被忽略)结果相对应;也和使用readelf中符号表相关内容对应(readelf命令输出结果比objdump输出结果看起来更易懂一些):
rodata段分析

因为位于.rodata段上面的.bss段size为0x00,所以.bss和.rodata偏移量一样(都是0x50),.rodata段大小为0xd,也就是13个字节。即:
68 65 6c 6c 6f 20 2c 20 35 32 31 36 00。



- 对照ACII码表 ,可以拼出其正好对应HELLO,5216
5.补充
从前面对ELF头的解析可以知道段表的地址是从0x1174(e_shoff项)开始,而上面的.shstrtab的开始地址为0xc0,大小为0x5f,所以此处段表应该是从0x11f开始(0xc0+0x5f)。再根据e_shnum=23和ehentsize=28可知,有23个段,每个段占28个字节大小,总共占据644个字节(16进制为0x284)。段入口的类型定义如下(/usr/include/elf.h):

- 从0x1174开始有13个段,每个段占28个字节大小。
第一个段,其中内容全部为0,所以不表示任何段。内容如下:
第二个段对应内容为:

段中每个成员均为4个字节,所以分析起来相对简单一些。
sh_name值为0x0000001f,它表示该段名称在.shstrtab中偏移量,通过计算可知该名称为.text。
sh_type值为0x00000001(对应SHT_PROGBITS),表示这个段拥有程序所定义的信息,其格式和含义完全有该程序确定。
sh_flags值为0x00000006(对应于SHF_ALLOC和SHF_EXECINSTR)。
sh_addr值为0x00000000,表示这个段不会出现在进程的地址镜像中。
sh_offset值为0x00000034(偏移地址),
sh_size值为0x00000017,表示代码段大小为23(0x17)个字节。
sh_link值为0x00000000,表示没有链接信息。
sh_info值为0x00000000,表示没有辅助信息。
sh_addalign值为0x00000004,表示4个字节对齐
sh_entsize值为0x00000000,表示没有入口。
第三个段为:

该段为.rel.text段(偏移量为0x0000001b),sh_type为0x00000009(对应SHT_REL),sh_offset为0x000003ec,sh_size为0x00000010(16个字节)。sh_link和sh_info分别为b和1,分别表示相关符号表索引和重定位应用段的段头索引。其余段的内容不再详细分析,可以自己分析并于前面readelf输出结果相对照。
……
第23个段
《Linux及安全》实践3.1的更多相关文章
- paip.java win程序迁移linux的最佳实践
paip.java win程序迁移linux的最佳实践 1.class load路径的问题... windows哈第一的从calsses目录加载,,而linux优先从jar加载.. 特别的是修理了ja ...
- 【转载】Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载六)Linux的网络配置
本篇是Linux小白最佳实践第6篇,目的就是让白菜们了解Linux网络是如何配置的.Linux系统在服务器市场占有很大的份额,尤其在互连网时代,要使用计算机就离不开网络. 想每天能听到小妞的语音播报, ...
- Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载五)Linux系统的对话方式
本篇是Linux小白最佳实践第5篇,目的就是让白菜们了解Linux进程之间是如何对话的.之前连载的几篇,在微信上引起了很多的反响,有人也反映图多文字少,感觉没有干货.本篇选了大部分是实战讲解的&quo ...
- Linux及安全实践五——字符集编码
Linux及安全实践五——字符集编码 一.ASCII码 在表中查找出英文字母LXQ相对应的十六进制数值为: 4c 58 51 在终端中输入命令:vim test1.txt 在vim页面输入命令:%!x ...
- Linux及安全实践四——ELF文件格式分析
Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...
- Linux及安全实践三——程序破解
Linux及安全实践三--程序破解 一.基本知识 常用指令机器码 指令 作用 机器码 nop 无作用(no operation) 90 call 调用子程序,子程序以ret结尾 e8 ret 返回程序 ...
- Linux及安全实践二——模块
Linux及安全实践二--模块 一.模块的编译.生成.测试.删除 1.编写模块代码 编写:gedit 3.c 2.编写Makefile obj-m :这个变量是指定你要声称哪些模块模块的格式为 obj ...
- Linux及安全实践二
Linux及安全实践二 基本内核模块 20135238 龚睿 1. 理解模块原理 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个 ...
- 20135323符运锦----LINUX第二次实践:内核模块编译
Linux实践二--模块 一.知识点总结 ①Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率 ...
- linux内核分析实践二学习笔记
Linux实践二--内核模块的编译 标签(空格分隔): 20135328陈都 理解内核的作用 Linux内核[kernel]是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能 ...
随机推荐
- asp.net mvc5 伪静态
asp.net mvc5 伪静态 WebForm Mvc4和5通用 1.背景:老项目WebForm开发 需要 融合到新项目Mvc5开发 2.需求:Url地址TruckDetail.aspx?id=45 ...
- whose view is not in the window hierarchy
参考:http://www.jianshu.com/p/9e90cb866fdf 在做界面跳转的时候,我们经常会用到这两个函数 func dismissViewControllerAnimated(f ...
- GD库处理图像
在PHP5中,动态图象的处理要比以前容易得多.PHP5在php.ini文件中包含了GD扩展包,只需去掉GD扩展包的相应注释就可以正常使用了.PHP5包含的GD库正是升级的GD2库,其中包含支持真彩图像 ...
- kettle系列-2.kettle源码结构分析
kettle是一个开源产品,产品本身设计是很优秀的,代码应该是很多开源爱好者用业余时间贡献的,代码整体结构还是比较容易理解的,但具体到每一个控件内部就因人而异了,感觉还是挺复杂的,肯定别人考虑得比较全 ...
- redis数据类型之—Set
(1)set 简单介绍 set集合的数据是不重复的.无序的,一个集合类型键可以存储至多2^32-1 个字符串. (2)set 常用命令
- 怎样看懂Oracle的执行计划
怎样看懂Oracle的执行计划 一.什么是执行计划 An explain plan is a representation of the access path that is taken when ...
- 1.0 Quartz 2D 简介
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” Quartz2D须知: (1)Quartz 2D是苹果官方的二维绘图引擎,同时支持 ...
- mysql数据去除重复及相关优化(转)
由于mysql不支持同时对一张表进行操作,即子查询和要进行的操作不能是同一张表,因此需要通过临时表中专以下. 1.单字段重复 生成临时表,其中uid是需要去重的字段 create table tmp_ ...
- 【ORACLE】常用脚本
--IFELSE DECLARE V_NUM NUMBER; BEGIN V_NUM := 100; IF V_NUM > 100 THEN -- ELSIF V_N ...
- maven 项目打包 及window下部署到tomcat
1.maven项目打包 2.将war文件拷贝到tomcat目录webapps下(不要再建目录)3.将必要的jar文件拷贝到tomcat目录libx下 war包 或jar 包 会生成到项目所在路径 的t ...



