《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]是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能 ...
随机推荐
- 网页Screen width、height、availWidth、availHeight属性
*screen.width 功能:声明了显示浏览器的屏幕的宽度,以像素计. 语法:screen.width *screen.height 功能:声明了显示浏览器的屏幕的可用宽度,以像素计. 语法:sc ...
- C#中将DataTable转成List
学习MVC的时候,使用List<T>来存储数据给前台,但是从数据库中直接读取得到的是DataTable,虽然可以直接循环DataTable来得到list,但是如果每个实体类都通过这样的得到 ...
- 伪随机数(线性同余法)C语言
/**Keil Lib*2015.6.12*Pass*by lort*/uint32 Srandx ; uint32 SrandK = 1103515245;//0x41C64E6D;uint32 S ...
- MVC+Easeyui dialog的小问题
今天在尝试 MVC+Easyui的练习中遇到的一些,小问题. 在.net MVC 中 在_layout.cshtml中设置Easyui 环境 ,在传到子页中,发现$("#dlg" ...
- C实现栈和队列
这两天再学习了数据结构的栈和队列,思想很简单,可能是学习PHP那会没有直接使用栈和队列,写的太少,所以用具体代码实现的时候出现了各种错误,感觉还是C语言功底不行.栈和队列不论在面试中还是笔试中都很重要 ...
- [MongoDB]MongoDB与JAVA结合使用CRUD
汇总: 1. [MongoDB]安装MongoDB2. [MongoDB]Mongo基本使用:3. [MongoDB]MongoDB的优缺点及与关系型数据库的比较4. [MongoDB]MongoDB ...
- [leetcode] 47. Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- 【Android】achartengine的柱状图和饼状图的使用
本文介绍了android中如何使用achartengine绘制饼图和柱状图,请分别尝试饼图和柱状图,曲线图. 先看效果图: 先看看获取数据: Workbook workbook = Workbook. ...
- Angular过滤器
angular中的过滤器有: currency 过滤货币 number 过滤数字, date 过滤日期 json 把js对象过滤为json字符串 limitTo 截取字符串,参数是正数则从左往右 ...
- SecureCRT 使用 rz 和 sz 命令
1.下载软件 rzsz-3.34.tar.gz,登录linux,用命令 wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz下载. 2.解 ...