-
-
[原创]Win PE系列之重定位表解析与模块注入技术
-
发表于: 2021-10-11 19:22 7677
-
考虑下面这段代码
为了给数组szHello赋值,程序从0x01881C0地址处开始依次取出相应的数据赋给数组szHello,而这个地址中,保存的就是要赋值给数组的字符串
但问题是,由于程序装载到内存中的基地址,也就是ImageBase是不一样的(dll文件和开了ASLR的exe文件),这就导致了这个字符串的地址会发生改变。重新编译上面的程序,会得到如下的结果
可以看到,此时的字符串的地址变成了0x004181C0。所以为了让程序运行的时候找到正确的字符串的地址,这就需要一块内存来保存所有引用了这个字符串地址的地址。当程序加载的时候,对这个地址进行重定位来找到正确的字符串的地址,这块内存就是重定位表。
重定位表位于数据目录的第6项,在文档中的定义如下
所指的地址指向了IMAGE_BASE_RELOCATION结构体,结构体的定义如下
这些需要重定位的地址都是按块保存的,每一个块都是一个IMAGE_BASE_RELOCATION后面跟上若干两字节的偏移地址。当找个一个块,它的VirtualAdreess和SizeOfBlock都是0的时候,说明已经没有重定位块要解析了。
而偏移地址有多少,就需要根据IMAGE_BASE_RELOCATION中的SizeOfBlock来决定,这个字段说明的是整个重定位块的大小,减去VirtualAddress和SizeOfBlock的占的8字节,在除以2就可以得到偏移地址的个数。
每个偏移地址的高4位如果是3的话,那么它的低12位就代表了偏移地址,这个偏移地址加上这个块的IMAGE_BASE_RELOCATION中的VirtualAddress就得到了需要进行重定位的地址。
所以可以用下面的代码来解析重定位表
部分输出结果如下
实现模块注入的相应过程如下
将要注入的模块在内存中的PE状态读入到内存中
将被注入的程序启动,并在它的进程空间中申请可以容纳注入的模块大小的空间
根据申请到的地址,去重定位读入到内存中的注入的模块的重定位表
将重定位以后的内存中的内容写入到申请到的地址
通过创建远程线程的方式启动要运行的模块
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]CVE-2022-21882提权漏洞学习笔记 16410
- [原创]CVE-2021-1732提权漏洞学习笔记 19515
- [原创]CVE-2014-1767提权漏洞学习笔记 15203
- [原创]CVE-2018-8453提权漏洞学习笔记 18542
- [原创]CVE-2020-1054提权漏洞学习笔记 13551