《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.分析各段

  1. .text段分析

    • Hello.o中.text大小为0X1c,即十进制的28。
    • 对hello.o进行反汇编
      • 可以看到.text段跨越0x0到0x1b,恰好共0x1c(即28)个字节

  2. .strtab段分析

    • 该段的offset是0x3d8(正好在.symtab段之后),size是0x13,即到0x2ea为止。

      对应字符串为:“\0hello.c\0main\0puts\0”

  3. .symtab段分析

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

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

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

  4. 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的更多相关文章

  1. paip.java win程序迁移linux的最佳实践

    paip.java win程序迁移linux的最佳实践 1.class load路径的问题... windows哈第一的从calsses目录加载,,而linux优先从jar加载.. 特别的是修理了ja ...

  2. 【转载】Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载六)Linux的网络配置

    本篇是Linux小白最佳实践第6篇,目的就是让白菜们了解Linux网络是如何配置的.Linux系统在服务器市场占有很大的份额,尤其在互连网时代,要使用计算机就离不开网络. 想每天能听到小妞的语音播报, ...

  3. Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载五)Linux系统的对话方式

    本篇是Linux小白最佳实践第5篇,目的就是让白菜们了解Linux进程之间是如何对话的.之前连载的几篇,在微信上引起了很多的反响,有人也反映图多文字少,感觉没有干货.本篇选了大部分是实战讲解的&quo ...

  4. Linux及安全实践五——字符集编码

    Linux及安全实践五——字符集编码 一.ASCII码 在表中查找出英文字母LXQ相对应的十六进制数值为: 4c 58 51 在终端中输入命令:vim test1.txt 在vim页面输入命令:%!x ...

  5. Linux及安全实践四——ELF文件格式分析

    Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...

  6. Linux及安全实践三——程序破解

    Linux及安全实践三--程序破解 一.基本知识 常用指令机器码 指令 作用 机器码 nop 无作用(no operation) 90 call 调用子程序,子程序以ret结尾 e8 ret 返回程序 ...

  7. Linux及安全实践二——模块

    Linux及安全实践二--模块 一.模块的编译.生成.测试.删除 1.编写模块代码 编写:gedit 3.c 2.编写Makefile obj-m :这个变量是指定你要声称哪些模块模块的格式为 obj ...

  8. Linux及安全实践二

    Linux及安全实践二   基本内核模块 20135238 龚睿 1.  理解模块原理 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个 ...

  9. 20135323符运锦----LINUX第二次实践:内核模块编译

    Linux实践二--模块 一.知识点总结 ①Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一个单内核.单内核由于所有内容都集成在一起,效率 ...

  10. linux内核分析实践二学习笔记

    Linux实践二--内核模块的编译 标签(空格分隔): 20135328陈都 理解内核的作用 Linux内核[kernel]是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能 ...

随机推荐

  1. 网页Screen width、height、availWidth、availHeight属性

    *screen.width 功能:声明了显示浏览器的屏幕的宽度,以像素计. 语法:screen.width *screen.height 功能:声明了显示浏览器的屏幕的可用宽度,以像素计. 语法:sc ...

  2. C#中将DataTable转成List

    学习MVC的时候,使用List<T>来存储数据给前台,但是从数据库中直接读取得到的是DataTable,虽然可以直接循环DataTable来得到list,但是如果每个实体类都通过这样的得到 ...

  3. 伪随机数(线性同余法)C语言

    /**Keil Lib*2015.6.12*Pass*by lort*/uint32 Srandx ; uint32 SrandK = 1103515245;//0x41C64E6D;uint32 S ...

  4. MVC+Easeyui dialog的小问题

    今天在尝试 MVC+Easyui的练习中遇到的一些,小问题. 在.net MVC 中  在_layout.cshtml中设置Easyui 环境  ,在传到子页中,发现$("#dlg" ...

  5. C实现栈和队列

    这两天再学习了数据结构的栈和队列,思想很简单,可能是学习PHP那会没有直接使用栈和队列,写的太少,所以用具体代码实现的时候出现了各种错误,感觉还是C语言功底不行.栈和队列不论在面试中还是笔试中都很重要 ...

  6. [MongoDB]MongoDB与JAVA结合使用CRUD

    汇总: 1. [MongoDB]安装MongoDB2. [MongoDB]Mongo基本使用:3. [MongoDB]MongoDB的优缺点及与关系型数据库的比较4. [MongoDB]MongoDB ...

  7. [leetcode] 47. Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  8. 【Android】achartengine的柱状图和饼状图的使用

    本文介绍了android中如何使用achartengine绘制饼图和柱状图,请分别尝试饼图和柱状图,曲线图. 先看效果图: 先看看获取数据: Workbook workbook = Workbook. ...

  9. Angular过滤器

    angular中的过滤器有: currency 过滤货币 number  过滤数字, date  过滤日期 json 把js对象过滤为json字符串 limitTo  截取字符串,参数是正数则从左往右 ...

  10. SecureCRT 使用 rz 和 sz 命令

    1.下载软件 rzsz-3.34.tar.gz,登录linux,用命令 wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz下载. 2.解 ...