Windows 7 Pro 是否将 ASLR 用于 win32 可执行文件?

逆向工程 视窗 开箱 二进制
2021-06-21 03:55:01

我解压了一个 UPX 打包的 PE 二进制文件。打包和解包的二进制文件都有固定的镜像库0x400000(由各种 PE 工具检查)。

但是,每次我在 OllyDbg 中运行程序时,图像都会定位到不同的基地址。当我重新打开二进制文件并开始运行它时,它会更改图像库,而当我单击 OllyDbg 中的重新启动图标时,它不会更改图像库。我在这篇文章中读到,win32 exe 从不使用 ASLR。这是真的?我有 win7 pro 和 OllyDbg1.10。

这是我真正的问题。解压后的可执行文件有一些地址引用无效。他们都使用标准的 win32 基础0x400000

例如,我解压后的程序中有如下指令,对 的引用407018无效。

  • 我怎样才能修复这个地址引用?
  • 如何在代码段0x40xxxx以to 格式更改所有地址引用0x1150000有没有工具可以做到这一点?

01153F2B  |. A1 18704000    MOV EAX,DWORD PTR DS:[407018]
01153F30  |. 8365 F8 00     AND DWORD PTR SS:[EBP-8],0
01153F34  |. 8365 FC 00     AND DWORD PTR SS:[EBP-4],0
01153F38  |. 53             PUSH EBX
01153F39  |. 57             PUSH EDI
01153F46  |. 74 0D          JE SHORT CrackME.01153F55
1个回答

为什么会发生这种情况?

每次加载图像时将图像库更改为不同的随机地址称为地址空间布局随机化(简称为 ASLR)。大多数现代操作系统在可能的情况下在用户模式进程上使用 ASLR(一些操作系统也对内核模式代码这样做,至少部分这样做)。

ASLR 的主要优势在于,如果利用基于内存损坏的漏洞(通常需要信息泄漏类型的漏洞来缓解),它会增加难度,因此受到安全社区的鼓励。

为了成为 ASLR,图像必须是可重定位的也就是说,无论它位于内存中的哪个位置,它都需要正常运行。这往往很复杂,因为某些指令(在某些架构中)是基于位置的。例如,在 x86 架构上,CALL指令可以是relativeabsolute,这使得在不冒崩溃风险的情况下更改图像加载地址是不可能的。

图像可以确保它只使用相对指令(有时可能很困难)或提供关系表作为图像文件的一部分。关系表明确列出了图像中使用的所有绝对地址,以便加载程序在图像被重新定位时进行修复。

如何避免ASLR?

显然,不鼓励禁用 ASLR,因为它提供了保护。在 64 位 Windows 用户模式下 ASLR 是必需的,因此您根本无法禁用它。但是,在 32 位 Windows 上,您可以并且可以通过禁用相关的 PE 标志来禁用它,方法是取消选中下图中标记的复选框:

禁用 ASLR