内存寻址

问题描述:

例如我们在Windows XP平台上,我们在ollydbg上有程序A,我们看看指令x。它具有地址0x11111111(例如)。如果我采取程序A并在具有相同平台的不同计算机上的ollydbg中运行,则指令x将具有相同的地址0x11111111? 所以我的问题是:内存地址每次运行程序A时都会改变吗?或者他们在不同的计算机或平台上更换?内存寻址

取决于架构,但不应该依赖这些地址是相同的。为了实际的目的,答案是否定的。

要回答你的评论,漏洞利用者必须找出它们的位置。这样做的一个简单的办法是拨打电话并弹出返回地址,像这样:

call test_eip 
test_eip: 
    pop eax 

在这种情况下,您将有指令指针eax。这对于确定注入代码的位置是有用的。

当然,你必须达到这个目标,主要是使用缓冲区溢出攻击。

* - 一如既往 - 提供了一个很好的解释和大量的链接到照顾:http://en.wikipedia.org/wiki/Stack_buffer_overflow

+0

非常感谢回答。 那么exploit(基于缓冲区溢出)如何在shellcode的起始地址必须覆盖返回地址并且我们不能依赖它们的堆栈上运行shellcode(假设没有保护)。这怎么可能?这是我不能得到的东西。 – nore 2010-12-09 23:08:09

+0

是的,但问题是:如果我不重定向返回地址执行它,如何运行test_esp。我必须先知道一个地址。例如,我不能在远程计算机上的漏洞程序中使用“gdb-it”。一个普遍的问题:众所周知的漏洞利用工具是如何工作的。让他们有一个返回地址的常量变量?我问得太多,但我认为这是差距正在下降。我需要一个指导,但如果你能回答我,我会很感激。 ty再次 – nore 2010-12-09 23:32:41

在有相同的可执行相同的操作系统版本,你可能会,但不肯定,看到相同的代码地址。不同的操作系统版本不太可能。

你看到的是一个虚拟地址。 CPU包含只能被操作系统看到的特殊寄存器;这些寄存器控制虚拟内存到物理内存的映射。每当操作系统切换到不同的进程时,它都会对这些寄存器进行重新编程,以便程序认为其内存始终处于相同的位置。

Windows PE二进制文件不是位置独立的,这意味着它们需要假设一个固定的地址来执行。微软这样做是为了提高执行性能(以加载时间惩罚为代价)。

您的二进制文件将始终从其所需的位置执行,但是,如果其偏好地址已被其他代码使用,则DLL可能会重新定位。

重新定位对您而言是透明的,Windows二进制装载程序会修改您的代码并修复所有地址,以便它们在新位置工作。