例如,我们在 Windows XP 平台上,我们在 ollydbg 上有程序 A,我们查看指令 x。它的地址为0x11111111(例如)。如果我使用程序A并在具有相同平台的另一台计算机上的ollydbg中运行指令x将具有相同的地址0x11111111?所以我的问题是:每次程序 A 运行时内存地址都会改变吗?还是它们在不同的计算机或平台上发生了变化?
4 回答
你看到的是一个虚拟地址。CPU 包含只有操作系统才能看到的特殊寄存器;这些寄存器控制虚拟内存到物理内存的映射。每次操作系统切换到不同的进程时,它都会重新编程这些寄存器,以便程序认为它的内存总是在同一个地方。
取决于架构,但您永远不应该依赖这些地址是相同的。出于实际目的,答案是否定的。
要回答您的评论,漏洞利用必须找出它们的位置。一个简单的方法是调用并弹出返回地址,如下所示:
call test_eip
test_eip:
pop eax
在这种情况下,您将在eax
. 这对于确定注入代码的位置很有用。
当然,您必须到达运行它的位置,主要是使用缓冲区溢出漏洞。
维基百科 - 一如既往 - 提供了一个很好的解释和很多链接来照顾:http ://en.wikipedia.org/wiki/Stack_buffer_overflow
在具有相同可执行文件的相同操作系统版本上,您可能会(但不一定)看到相同的代码地址。不同的操作系统版本,可能性较小。
Windows PE 二进制文件不是位置独立的,这意味着,它们需要假定一个固定的地址来执行。Microsoft 这样做是为了提高执行性能(以加载时间为代价)。
您的二进制文件将始终从它想要的位置执行,但是如果它们的首选地址已被其他代码使用,则 DLL 可能会重新定位。
重定位对您来说是透明的,Windows 二进制加载程序会修改您的代码并修复所有地址,以便它们在新位置工作。