第四周培训
第四周学习任务 1.nssctf上5-10题,写出wp 2.了解pe文件系统中的dos头,pe头部分,安装winhex破解版 3.了解VA,IMAGEBase,RVA,FA具体指什么 4.编程判断主机字节序(了解大小端序) 以上内容均写入博客。
一.了解pe文件系统中的dos头,pe头部分
初识PE文件--dos头、pe头 - cunren - 博客园 (这个网站讲的巨全面)
首先如何判断是否为PE文件
1.我们可以通过010Editor,winhex等工具来观察头信息,是不是MZ
2.通过PEiD这个工具直接得出
PE 结构包含的结构体有 DOS 头、PE 标识、文件头、可选头、目录结构、节表等。

关于DOS头
无论是32位或64位可执行文件,其文件的头部必定是IMAGE_DOS_HEADER
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; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
.
MZ文件头和Dos Stub。
MZ文件头:IMAGE_DOS_HEADER 结构体,其大小占64个字节,并且该结构中的最后一个LONG类型e_lfanew成员指向PE文件头的位置为中的PE文件头标志的地址。
这里有两个比较有用的成员信息:
1、e_magic,用于判断PE文件的标识。如果不是MZ即不是十六进制值:0x5A4D。计算机存储顺序是低位在前高位在后,所以存储为:0x4D5A。
2、e_lfanew,这里是指pe的偏移量,用于找到pe头的位置
如下阴影区域:

DOS stub:dos存根,在IMAGE_DOS_HEADER和IMAGE_NT_HEADERS之间存在一DOS存根,这其实是一段汇编代码:
PE文件是运行在32位或64位操作系统下的。
其功能是当该EXE运行在16位环境下,输出一段文字:“This program cannot be run in DOS mode”,然后并退出该进程。
在pe文件利用的时候,我们可以把payload写入到当前区域,诸如存放我们的shellcode,在读取时,获取dos头字节数,减去MZ头字节数,即为dos存根字节大小。然后拿去操作加载shellcode等。

PE头:
在MS-DOS头下main,就是PE头,PE头是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称,其中包含许多PE装载器用到的重要字段。
IMAGE_NT_HEADER数据结构定义:
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
将文件标识为 PE 映像的 4 字节签名。字节为“PE\0\0”。这个字段是PE文件的标志字段,通常设置成00004550h,其ASCII码为PE00,这个字段是PE文件头的开始,前面的DOS_HEADER结构中的字段e_lfanew字段就是指向这里。
剩下的都可以看那个网站里面的,特别好
了解VA,IMAGEBase,RVA,FA具体指什么
1. VA (Virtual Address) - 虚拟地址
VA 是指进程在虚拟内存中访问数据时使用的地址。现代操作系统使用虚拟内存技术,使得每个进程认为它拥有独立的内存空间。实际上,这些虚拟地址会被操作系统映射到物理内存中的某个位置。虚拟地址通常被用于进程的地址空间,操作系统负责将虚拟地址映射到物理内存(或交换到硬盘上)。
在 Windows 中,进程通过虚拟地址访问其可执行文件的代码、数据和堆栈等。
2. IMAGEBase - 可执行文件基址
IMAGEBase 是 Windows 可执行文件(如 .exe 或 .dll)的一个字段,指示程序加载到虚拟内存时的基地址。它是该文件在内存中加载时的起始地址。这个基地址通常由操作系统指定,当程序被加载到内存时,操作系统会将可执行文件的内容放置在指定的虚拟地址范围内。
-
IMAGEBase 在 PE(Portable Executable)文件头的
Optional Header部分定义。 -
对于一个 Windows 可执行文件,当它加载到内存中时,操作系统将从
IMAGEBase地址开始加载该文件的内容。
例子:
-
如果一个程序的
IMAGEBase是0x00400000,那么程序加载到内存时,其起始位置会从虚拟地址0x00400000开始。
3. RVA (Relative Virtual Address) - 相对虚拟地址
RVA 是相对于某个模块的 IMAGEBase 的偏移地址。在 Windows 可执行文件中,程序中的各个部分(如代码、数据、符号表等)都有一个 RVA,表示该部分相对于 IMAGEBase 的偏移量。
简言之,RVA 是一种相对地址,它不包含实际的加载基地址,而是仅仅指示了某个数据项相对于模块加载基地址的位置。
-
例如,如果某个数据段的 RVA 是
0x1000,而程序的 IMAGEBase 是0x00400000,那么该数据段的虚拟地址就是0x00401000(IMAGEBase + RVA)。
RVA 与 VA 的关系:
-
RVA 是相对于模块的 IMAGEBase 的偏移量,而 VA 是加载到虚拟内存中的实际地址。通过将 RVA 加上 IMAGEBase,可以得到文件加载到内存中的实际虚拟地址(VA)。
4. FA (File Address) - 文件地址
FA 是指文件中的物理地址,通常是指文件中数据的实际偏移量。它表示文件中某个数据项在磁盘文件中的位置,而不是在内存中的位置。
-
当程序从磁盘加载时,文件中的内容会被映射到虚拟内存中。
-
FA 和 RVA 是不同的,因为 FA 是相对于文件本身的偏移,而 RVA 是相对于加载到内存后的偏移。
FA 与 RVA 的关系:
-
在 PE 文件中,文件中的各个部分(如代码段、数据段等)都有一个文件偏移(FA),而相对于 IMAGEBase 的偏移是 RVA。在加载过程完成后,文件中的 FA 会通过映射转换为内存中的 RVA。
关系总结
-
VA (Virtual Address):程序加载到虚拟内存中的地址。
-
IMAGEBase:可执行文件的基地址,即它加载到内存时的起始地址。
-
RVA (Relative Virtual Address):相对于 IMAGEBase 的偏移量,用于指示文件或模块中数据的位置。
-
FA (File Address):文件中的物理地址或偏移,表示文件数据的实际位置。
具体例子
假设你有一个 PE 文件,其中:
-
IMAGEBase 为
0x00400000。 -
一个数据段的 RVA 为
0x00100000,即这个数据段相对于IMAGEBase的偏移。 -
文件中该数据段的 FA(文件地址)为
0x00020000。
那么:
-
该数据段在内存中的虚拟地址 VA 为
IMAGEBase + RVA = 0x00400000 + 0x00100000 = 0x00500000。 -
该数据段在文件中的物理位置是
FA = 0x00020000。
这些概念在程序分析、调试和逆向工程中非常重要,尤其是在需要从磁盘文件解析和加载可执行文件时。。
编程判断主机字节序(了解大小端序)
在编程中,判断主机的字节序(即大小端序)是一个非常常见的问题,尤其是在跨平台开发中。字节序指的是多字节数据(例如 int、float 等)在内存中的存储顺序。常见的字节序有两种:
-
大端序(Big-Endian):高位字节存储在低地址端,低位字节存储在高地址端。
-
小端序(Little-Endian):低位字节存储在低地址端,高位字节存储在高地址端。
第四周培训:PE文件与地址概念学习
894

被折叠的 条评论
为什么被折叠?



