第三章 Linux目标文件解析

ops/2024/10/19 20:02:53/

解析目标文件内容:举例说明

//root@ubuntu:/mnt/hgfs/share/019-proself/04# cat simplesection.c
int printf(const char* format,...);
int global_init_var=84;
int global_uninit_val;
void func1(int i)
{printf("%d\n",i);
}
int main(void)
{static int static_var = 85;static int static_var2;int a=1;int b;func1(static_var + static_var2 + a  + b);return a;
}

1、文件格式有哪些?

 2、ELF文件类型有几种类型?

(1)可重定位文件.o

(2)可执行文件

(3)共享目标文件

(4)核心转储文件(Linux下的core dump文件)

3、如何查看文件类型---file命令

4、目标文件的基本框架

(1)虚拟空间的映射关系

(2)objdump -h 查看文件总共的段以及偏移

 注意:bss段并不占文件的空间。

 

 (3)接下来分析代码段

从objdump -h查看文件段空间知道,text的偏移和大小,

objdump -s 查看段内容

objdump -d 查看段反汇编

 (4)数据段

①.data段存放了初始化的全局变量和局部静态变量。

②printf的时候用到了字符串常量“%d\n”,存放在.rodata

③小端存储0x54

④强符号和弱符号概念

 (5)bss段

存放未初始化的全局变量和局部静态变量。准确的将是.bss段为他们预留空间。我们只能通过符号表查看,使用objdump -s打印所有段的内容无法查看,以为不在文件中存放。

问题:从代码来看bss,应该有3个整形数

 

 (7)常见的其他短分析

root@ubuntu:/mnt/hgfs/share/019-proself/04# objdump -h /bin/ls/bin/ls:     file format elf32-i386Sections:
Idx Name          Size      VMA       LMA       File off  Algn0 .interp       00000013  08048154  08048154  00000154  2**0CONTENTS, ALLOC, LOAD, READONLY, DATA1 .note.ABI-tag 00000020  08048168  08048168  00000168  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA2 .note.gnu.build-id 00000024  08048188  08048188  00000188  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA3 .gnu.hash     0000006c  080481ac  080481ac  000001ac  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA4 .dynsym       00000820  08048218  08048218  00000218  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA5 .dynstr       000005d5  08048a38  08048a38  00000a38  2**0CONTENTS, ALLOC, LOAD, READONLY, DATA6 .gnu.version  00000104  0804900e  0804900e  0000100e  2**1CONTENTS, ALLOC, LOAD, READONLY, DATA7 .gnu.version_r 000000c0  08049114  08049114  00001114  2**2  CONTENTS, ALLOC, LOAD, READONLY, DATA8 .rel.dyn      00000038  080491d4  080491d4  000011d4  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA9 .rel.plt      00000380  0804920c  0804920c  0000120c  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA10 .init         00000023  0804958c  0804958c  0000158c  2**2CONTENTS, ALLOC, LOAD, READONLY, CODE11 .plt          00000710  080495b0  080495b0  000015b0  2**4CONTENTS, ALLOC, LOAD, READONLY, CODE12 .text         0001078c  08049cc0  08049cc0  00001cc0  2**4CONTENTS, ALLOC, LOAD, READONLY, CODE13 .fini         00000014  0805a44c  0805a44c  0001244c  2**2CONTENTS, ALLOC, LOAD, READONLY, CODE14 .rodata       000040a8  0805a460  0805a460  00012460  2**5CONTENTS, ALLOC, LOAD, READONLY, DATA15 .eh_frame_hdr 00000744  0805e508  0805e508  00016508  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA16 .eh_frame     00002f34  0805ec4c  0805ec4c  00016c4c  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA17 .init_array   00000004  08062ef8  08062ef8  00019ef8  2**2CONTENTS, ALLOC, LOAD, DATA18 .fini_array   00000004  08062efc  08062efc  00019efc  2**2CONTENTS, ALLOC, LOAD, DATA19 .jcr          00000004  08062f00  08062f00  00019f00  2**2CONTENTS, ALLOC, LOAD, DATA20 .dynamic      000000f8  08062f04  08062f04  00019f04  2**2CONTENTS, ALLOC, LOAD, DATA21 .got          00000004  08062ffc  08062ffc  00019ffc  2**2CONTENTS, ALLOC, LOAD, DATA22 .got.plt      000001cc  08063000  08063000  0001a000  2**2CONTENTS, ALLOC, LOAD, DATA23 .data         00000160  080631e0  080631e0  0001a1e0  2**5CONTENTS, ALLOC, LOAD, DATA24 .bss          00000c54  08063340  08063340  0001a340  2**5ALLOC25 .gnu_debuglink 00000008  00000000  00000000  0001a340  2**0CONTENTS, READONLY

5、为什么需要把数据段和指令分开存放?

(1)权限问题,代码段只读

(2)现代cpu缓存有数据缓存和指令缓存

(3)为了实现多进程共享指令和共享数据

6、反过来分析elf的文件头

ELF头定义的结构体: 

 

 

 7、分析段表

①利用readelf -S 查看段表

②段的类型 

 8、重定位表

对于每一个需要重定位的代码段和数据段,都需要一个对应的重定位表。因为text中使用了printf函数,需要访问绝对地址。而.data中,没有绝对地址的引用,它只包含了几个常量。

 

 9、字符串表


http://www.ppmy.cn/ops/45304.html

相关文章

React-useState

useState基础使用 useState是一个React Hook(函数),它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果 本质:和普通JS变量不同的是,状态变量一旦发生变化组件的视图UI也会跟着变化&#xff0…

现代操作系统上创建各类链接的方法汇总

文章目录 现代操作系统上创建各类链接的方法汇总windows: cmd下的mklink创建链接示例 powershell 创建链接创建常规文件和目录创建链接 linux shell 创建硬链接NAMESYNOPSIS详细说明常用选项示例 检查与辨识符号链接🎈linux下检查ls -l 命令file 命令 windows下检查…

Python OCR 文字识别使用模型:读光-文字识别-行识别模型-中英-通用领域

介绍 什么是OCR? OCR是“Optical Character Recognition”的缩写,中文意为“光学字符识别”。它是一种技术,可以识别和转换打印在纸张或图像上的文字和字符为机器可处理的格式,如计算机文本文件。通过使用OCR技术,可…

红队内网攻防渗透:内网渗透之前置知识外网权限提升技术

红队内网攻防渗透 1. 内网权限提升技术1.1 外网权限提升的思路-前置知识1.1.1 外网权限提升知识点:1.1.2 外网权限提升基础内容1.1.2.1 为什么我们要学习权限提升转移技术:1.1.2.2 具体有哪些权限需要我们了解掌握的:1.1.2.3 以上常见权限获取方法简要归类说明:1.1.2.4 以上…

使用C语言实现学生信息管理系统

前言 在我们实现学生信息管理系统的过程中,我们几乎会使用到C语言最常用最重要的知识,对于刚学习完C语言的同学来说是一次很好的巩固机会,其中还牵扯到数据结果中链表的插入和删除内容。 实现学生信息管理系统 文件的创建与使用 对于要实现…

Python爬虫技术深度解析与实战案例

一、引言 随着互联网的快速发展,网络数据已成为人们获取信息、进行研究的重要资源。Python作为一种功能强大且易于学习的编程语言,在爬虫领域有着广泛的应用。本文将详细介绍Python爬虫技术的基本原理、核心组件,并通过一个实战案例展示Pyth…

Laravel 图片添加水印

和这个配合使用 Laravel ThinkPhP 海报生成_laravel 制作海报-CSDN博客 代码 //水印 $x_length $imageInfo[0]; $y_length $imageInfo[1];$color imagecolorallocatealpha($posterImage, 255, 255, 255, 70); // 增加透明度参数alpha$font_size 40; //字体大小 $angle …

C语言函数复习全解析:参数、无参、嵌套与递归

C语言复习 函数篇 文中包括调用有参函数和无参函数、函数的嵌套和递归。首先,通过一道例题介绍了有参函数的概念和用法,即定义一个函数,接受特定参数并返回结果。接着,讲解了无参函数,即执行函数时不需要返回数值,只执行特定操作。然后,介绍了函数的嵌套,即在一个函数内部调用…