PE文件笔记四 PE文件头之标准PE头
转载好文 (๑•̀ㅂ•́)و✧
继续具体学习PE的各个结构细节,前面学完了DOS部首,接着学习PE文件头
由于PE文件头的内容较多,故要拆分为多个笔记,此笔记主要为标准PE头
PE文件头PE文件头结构
两种PE文件头PE文件头的结构有两种,分别对应32位的程序和64位的程序,它们的差异在于扩展PE头的结构
PE文件头结构
说明
_IMAGE_NT_HEADERS
32位程序对应的PE文件头结构
_IMAGE_NT_HEADERS64
64位程序对应的PE文件头结构
_IMAGE_NT_HEADERS
对应C中的结构体(类型)
说明
“PE”,0,0
DOWRD
PE标识
IMAGE_FILE_HEADER
IMAGE_FILE_HEADER
标准PE头
IMAGE_OPTIONAL_HEADER32
IMAGE_OPTIONAL_HEADER32
扩展PE头 32位
_IMAGE_NT_HEADERS64
对应C中的结构体(类型)
说明
“PE”,0,0
DOWRD
PE标识,固定值不可变
IMAGE_FILE_HEAD ...
PE文件笔记三 DOS部分
先转载一下怕以后找不到ヽ(✿゚▽゚)ノ
前面学习了PE结构的总体结构,接下来将具体学习PE的各个结构细节
这次学习的结构为DOS 部首
DOS部首DOS部首结构
DOS部首结构
对应C中的结构体
说明
DOS ‘MZ’ HEADER
_IMAGE_DOS_HEADER
DOS MZ头 结构体
DOS stub
无
DOS 存根
DOS MZ头结构体截图在winnt.h中找到_IMAGE_DOS_HEADER,得到以下截图(具体查找对应C结构体方法在PE文件笔记一 PE介绍中已经说明了,这里不再赘述)
结构体代码复制代码 隐藏代码typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_cblp; // Bytes on last page of file WORD e_cp; ...
攻防世界 re -re1
一天一道ctf系列
攻防世界re1
这道题我们有两种解法,先说说第一种
第一种解法我们先直接拖入ida
f5查看伪代码,如上图,可以分析出flag保存在v9中,然后再和v5比较,如果相同则输出aflag。所以我们可以猜测flag的值作为常量保存在了程序内部,那么我们直接查看字符串。
为啥找不到呢 ?
一脸懵逼的我打开了百度搜索,看到了这个大佬的文章
大概意思是ida在反编译过程中采用的是下降法,这种方法很少会误将数据当作代码进行反编译,但是这次很不幸,我们的flag呗反编译了,所以解决方法是:在IDA打开文件时选择binary file,在此模式下IDA不会进行反编译,此时再打开strings界面就可发现flag。
开始实践:
成功找到
第二种方法正常流程进入main函数,发现flag输入v9中且和v5比较,所以我们推测flag存储在v5中,通过源码追踪v5。
可以看到,xmmword_413E34赋值给了v5,所以xmmword_413E34就是我们要找的值,双击进去,得到了一串数字。
将数字转化为字符串
因为计算机采取的是小端存储,所以我们倒着输入就成功了
get fl ...
esp定律脱壳
esp定律脱壳
————————————纯属个人理解,如有不对求大佬指正。
看了好多关于esp定律脱壳的文章,都没看懂,o(≧口≦)o,可能是本人太笨了吧。所以就来浅谈一下自己对于esp脱壳的理解。
个人对于esp脱壳的理解是先把壳跑完,此时的oep就是真正的程序入口。然后再将源程序通过工具dump出来为一个exe文件,再进行一些修复操作,就脱壳完毕了。
接下来是实战操作 ┭┮﹏┭┮ ,我直接通过buuctf里的新年快乐题目来操作吧。
查壳首先拖入ide中,我们会发现只有两个函数,是不是很可疑,
所以我们直接将它拖入Exeinfope中
可以看到该exe文件里有一个UPX壳,那么我们就开始脱壳吧。
esp脱壳esp定律脱壳(个人理解):在外壳代码中有一个pushad的指令,该指令会将所有的寄存器的值都压入栈中也就是说在pushad指令之后esp的值就是指向外壳的代码段了,等之后运行完外壳程序,我们只要找到OEP就可以了
关于esp定律如果有不懂的话推荐看一下这个文章,或者百度。反正都比我讲的好多了。 o( ̄ヘ ̄o#)
拖入od将exe拖入X32dbg开始分析,首先找到pushad, ...
PE文件笔记二 PE文件的两种状态
一篇转载文章,转载于:https://www.52pojie.cn/thread-1393291-1-1.html一个PE文件可以分为两种状态:运行态和非运行态
非运行态:当一个PE文件尚未被运行时,其数据存储在磁盘中,也就是PE个人笔记一之PE介绍中PE的状态
运行态:当一个PE文件被打开后,PE文件的相关数据将被装载到内存中,此时为运行态
在细讲PE两种状态前,回顾先前在笔记一中的相关内容:
整体结构图
整体结构表
结构
对应C数据结构
默认占用空间大小(单位字节)
DOS MZ头
_IMAGE_DOS_HEADER
64
DOS Stub
仅在MS-DOS系统下有效,不作研究
不固定
PE文件头
_IMAGE_NT_HEADERS
4+20+224=248
PE文件头标志
Signature
4
PE文件表头/标准PE头
_IMAGE_FILE_HEADER
20
PE文件表头可选部分/扩展PE头
_IMAGE_OPTIONAL_HEADER
224
块表/节表
_IMAGE_SECTION_HEADER
40
块/节
无
由块表/节表决定 ...
PE文件笔记一 PE介绍
近期发现了一个超牛逼的大佬,和大佬写的超详细的pe总结,所以就根据(抄袭)大佬文章做一些pe总结来巩固学习。
先挂上大佬文章链接:https://www.52pojie.cn/forum.php?mod=viewthread&tid=1391994&page=1&extra=#37411342_pe%E5%9C%A8c%E4%B8%AD%E7%9A%84%E5%AE%9A%E4%B9%89
可执行文件的格式
Windows平台PE(Portable Executable)文件结构
Linux平台ELF(Executable and Linking Format)文件结构
常见的可执行文件.exe .dll .sys都是windows下常见的可执行文件。(他们都遵循pe文件结构大二的格式)
常见的非可执行文件
.txt .png .mp4等等都是非可执行文件,它们都需要使用其它可执行文件的软件进行加载
.txt可以使用Notepad、UltraEdit等 文本 工具查看
.png可以使用PhotoShop等 图片 工具查看
.mp4可以使用PotPlayer等 ...
pe文件结构新增节
首先先了解一下节表
如下图,打开一个exe文件,我们可以看到有多个节表。为什么要有这么多节表呢?每个节表都有自己的任务与功能,所以我们可以手动添加一个节来实现我们自己想实现的功能。
然后我们在了解一下节表的主要成员:
typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //8个字节名字.自己可以起.编译器也可以给定.不重要. union { DWORD PhysicalAddress; DWORD VirtualSize; //节数据没有对齐后的大小.也就是没有对齐.节数据有多大. } Misc; DWORD VirtualAddress; //加载到内存中的第一个字节的地址.也就是虚拟地址.节在内存中哪里开始.内存中的VA + ImageBase 才是真正的节开始位置 DWORD SizeOfRawData; ...
pe文件结构在空白区添加代码
想要再空白区添加代码,首先我们需要清晰一下我们需要做的步骤。
1.查找本机MessageBoxA地址2.打开OD调试工具拖入要添加的exe程序。3.在命令中输入 : (输入后按下回车键)4.找任意一段空白区添加上代码 (最好是添加到 空白区开始预留一行的位置,便于以后再添加更多代码节约空间)5.计算E8跳转的地址6.修改OEP (程序入口的点)
预备知识
汇编指令
硬编码
call
E8 00 00 00 00
jmp
E9 00 00 00 00
push
6A 00
1.查找本机MessageBoxA地址1.打开OD调试工具拖入要添加的exe程序。讲你想要修改的exe程序拖入od调试工具中,这里我们需要注意该exe程序必须有user32.dll,否则没有我们要添加的代码–MessageA函数的地址。
2.在命令中输入 : (输入后按下回车键)bp MessageBoxA
如此一来,我们就成功在MessageA函数的地址下了断点。点击断点的窗口即可查看我们设置好的断点。
开始添加代码1.接下来就该添加我们想要添加的代码了,随便找一个空白位置,然后我们计算c ...
对于硬编码的一些理解(水)
在最近的学习过程中,了解到了硬编码这一个名词,于是就去百度了一下,从字面意思上来看,我对硬编码的理解就是一种类似于编程语言的东西,但百度过后发现好像每一篇文章对硬编码的讲解都不大一样,搞得我一脸懵逼,于是就来总结一下各篇文章的讲解。首先我们看一下百度百科的结果:
硬编码是将数据直接嵌入到程序或其他可执行对象的源代码中的软件开发实践,与从外部获取数据或在运行时生成数据不同。硬编码数据通常只能通过编辑源代码和重新编译可执行文件来修改,尽管可以使用调试器或十六进制编辑器在内存或磁盘上进行更改。硬编码的数据通常表示不变的信息,例如物理常量,版本号和静态文本元素。另一方面,软编码数据对用户输入,HTTP服务器响应或配置文件等任意信息进行编码,并在运行时确定。
看完以后仍然一脸懵逼,于是继续百度,过程中看到了一个例子:硬编码:
if (a == 2) { a = 1;}
在此,a直接用固定数值2限定死了,如果想要修改的话(修改a的值或者==号右边的值都是很不方便的,而且很容易出错)很不方便。
软编码
int a = 2;int b = 3;if (a == b) ...
pe文件对齐
内存对齐与文件对齐
一个pe文件无论在磁盘和内存中存放都会进行对齐,但他们的对齐值会不相同。PE 文件头里边的FileAligment 定义了磁盘区块的对齐值。每一个区块从对齐值的倍数的偏移位置开始存放。而区块的实际代码或数据的大小不一定刚好是这么多,所以在多余的地方一般以00h 来填充,这就是区块间的间隙。PE 文件头里边的SectionAligment 定义了内存中区块的对齐值。PE 文件被映射到内存中时,区块总是至少从一个页边界开始。rva与fov的相互转换
RVA与FOV的相互转换
为什么要转换:可以通过内存位置.找到文件中这个数据的位置. 或者反之. 如果找到就可以进行修改了。RVA(Relative Virtual Address)指的是内存中的一个数据相对于文件头位置的偏移量。举个例子:当我们想要访问一个数据时,如果 Windows 装载器将一个PE 文件装入到 00400000h 处的内存中,而某个区块中的某个数据被装入 0040…xh 处,那么这个数据的 RVA 就是(0040…xh - 00400000h )= …xh。(RVA = 虚拟地址-ImageBa ...