《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]是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能 ...
随机推荐
- 创建新用户,连接Oracle数据库
1.sys用户是最高管理员用户,那我们就用这个sys用户登录oracle:
- way.js - 轻量级、持久化的双向绑定JS库
AngularJS的双向绑定一直为人称道,但使用AngularJS需要对页面组件化,学习成本还是很高的. 本文源自 https://github.com/gwendall/way.js 边学边译. 使 ...
- 【Java EE 学习 23】【log4j的使用】【ant的使用】【内省】
一.ant下载地址:http://ant.apache.org/bindownload.cgi 二.log4j下载地址:http://logging.apache.org/log4j/2.x/dow ...
- Build2016上值得一看的大数据相关Session
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:Build2016开完很久了,现在才来回顾下,就说说那些和大数据相关的Session, ...
- Borland C++建立工程菜鸟教程
实在不敢相信,学校里现在教学用的编译器还是七八十年代的老古董,难道这东西更能培养从没接触过代码的学生深刻理解c语言的运行流程,不得不说像VisualStdio这样的重量级开发环境确实屏蔽了很多底层的运 ...
- NSURLConnection 异步加载网络数据
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- TextSwitcher 简单用例
TextSwitcher 字面理解是文字交换器,是ViewSwitcher的子类,从ViewSwitcher来看,是View交换器,TextSwitcher继承自ViewSwitcher,显然是交换T ...
- CodeForces 515A
A. Drazil and Date time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 在DrawingVisual上绘制圆形的进度条,类似于IOS系统风格。
1.说明:在WPF中,文件下载时需要显示下载进度,由于系统自带的条型进度条比较占用空间,改用圆形的进度条,需要在DrawingVisual上呈现. 运行的效果如图: private Point Get ...
- js学习
2014-02-21 var p=function(){}(); //表示定义一个变量P,变量后面的函数为返回值 var p = function(){return 'abc';}(); alert( ...