首页
社区
课程
招聘
[分享]PE手动重定位
发表于: 2019-11-15 15:44 7356

[分享]PE手动重定位

2019-11-15 15:44
7356

工具:RadAsm,010 Editor,LordPE。

输出一句“welcome”,然后执行system(pause)

在这里插入图片描述

然后。用010Editor打开,开启重定位。

在这里插入图片描述

在这里插入图片描述

关于这两个属性,文件头中的IMAGE_FILE_RELOCS_STRIPPED是去除重定位信息的意思,可选头中的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE是动态基址的意思,前者置0,不去除信息;后者置1,开启动态基址。

再次用OD加载。

在这里插入图片描述

可以看到,加载基址变了,但是两个字符串还有两个函数的地址还是没有变,导致程序不能运行。下面就要添加重定位信息,让它们一块改变。

要分清楚区段和数据目录表的关系。添加重定位信息要修改的是数据目录表下标为5那一项,不是添加.reloc区段(而且添加了也没法加载)。区段是规定了属性,真正用来找到重定位信息的是数据目录表。

在PE中找个位置,我选择了700H,然后计算它的RVA。

在这里插入图片描述
根据LordPE,700H位于rdata段,RVA==700h-600h+2000h==2100h

我们有两个字符串和两个函数需要重定位,也就是4个WORD,加上两个DWORD,大小SizeOfBlock == 10H。数据目录表中的size还要算上结尾两个0,所以是12h.

在这里插入图片描述

因为我们的程序是32位,所以重定位项的最高位TypeIMAGE_REL_BASED_HIGHLOW==3,64位的PE通常为IMAGE_REL_BASED_DIR64==A

根据第一张OD加载截图,VirualAddress==1000H,4个偏移分别为001h, 007h, 00fh, 015h

这样,重定位信息就完成了。

00000700: 00 10 00 00 10 00 00 00 01 30 07 30 0F 30 15 30

再次用OD加载看一下。

在这里插入图片描述

4个位置的opcode都有了下划线,说明有重定位,运行也没有问题。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 4
支持
分享
最新回复 (6)
雪    币: 405
活跃值: (1071)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
2
,非常适合学习重定位表的实验
2019-11-15 19:10
0
雪    币: 2
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这是把4个偏移001h, 007h, 00fh, 015h 写到了700的位置,话说如果程序很多都写到这里有什么用处,毕竟好像不是重新定位到新的api
最后于 2020-1-22 17:55 被asaqlp编辑 ,原因:
2020-1-22 17:44
0
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
4
感谢分享!
2020-2-12 21:39
0
雪    币: 281
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
楼主,4个偏移001h, 007h, 00fh, 015h  能详细讲下么?谢谢
2020-2-14 15:23
0
雪    币: 7632
活跃值: (4583)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
asaqlp 这是把4个偏移001h, 007h, 00fh, 015h 写到了700的位置,话说如果程序很多都写到这里有什么用处,毕竟好像不是重新定位到新的a ...
程序本来没有重定位,700是我随便找的,然后手动加上,对于正常开启重定位的程序,这属于编译器的工作。还有并不只是api需要重定位,全局变量也需要。
2020-2-16 14:39
0
雪    币: 7632
活跃值: (4583)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
画骨 楼主,4个偏移001h, 007h, 00fh, 015h 能详细讲下么?谢谢
看第一个OD截图,这4个偏移相对于401000,opcode分别是“welcome”,printf(),“pause”,system()。
2020-2-16 14:42
0
游客
登录 | 注册 方可回帖
返回
//