例如我们在Windows XP平台上,我们在ollydbg上有程序A,我们看看指令x。它具有地址0x11111111(例如)。如果我采取程序A并在具有相同平台的不同计算机上的ollydbg中运行,则指令x将具有相同的地址0x11111111? 所以我的问题是:内存地址每次运行程序A时都会改变吗?或者他们在不同的计算机或平台上更换?内存寻址
Q
内存寻址
0
A
回答
0
取决于架构,但不应该依赖这些地址是相同的。为了实际的目的,答案是否定的。
要回答你的评论,漏洞利用者必须找出它们的位置。这样做的一个简单的办法是拨打电话并弹出返回地址,像这样:
call test_eip
test_eip:
pop eax
在这种情况下,您将有指令指针eax
。这对于确定注入代码的位置是有用的。
当然,你必须达到这个目标,主要是使用缓冲区溢出攻击。
维基百科 - 一如既往 - 提供了一个很好的解释和大量的链接到照顾:http://en.wikipedia.org/wiki/Stack_buffer_overflow
0
在有相同的可执行相同的操作系统版本,你可能会,但不肯定,看到相同的代码地址。不同的操作系统版本不太可能。
1
你看到的是一个虚拟地址。 CPU包含只能被操作系统看到的特殊寄存器;这些寄存器控制虚拟内存到物理内存的映射。每当操作系统切换到不同的进程时,它都会对这些寄存器进行重新编程,以便程序认为其内存始终处于相同的位置。
0
Windows PE二进制文件不是位置独立的,这意味着它们需要假设一个固定的地址来执行。微软这样做是为了提高执行性能(以加载时间惩罚为代价)。
您的二进制文件将始终从其所需的位置执行,但是,如果其偏好地址已被其他代码使用,则DLL可能会重新定位。
重新定位对您而言是透明的,Windows二进制装载程序会修改您的代码并修复所有地址,以便它们在新位置工作。
相关问题
- 1. PyCUDA内存寻址:内存偏移量?
- 2. 为什么字节寻址内存而不是4字节寻址内存?
- 3. 字节寻址内存(数据对齐)
- 4. 学习C - 指针和内存寻址
- 5. 什么是统一寻址内存?
- 6. MIPS汇编中的内存寻址
- 7. 内容寻址网络
- 8. 寄存器间接寻址
- 9. 寄存器寻址模式与直接寻址模式
- 10. 当最大内存不通电时,计算机如何处理内存寻址?
- 11. 虚拟内存的最大可寻址空间是多少?
- 12. 为c结构数组寻址和分配内存
- 13. 4千字节内存中有多少个可寻址位?
- 14. Windows - 这种内存寻址是如何工作的?
- 15. 关于寻址内存,GDT的粒度位有什么变化?
- 16. 关于实模式物理内存寻址
- 17. 了解装配MIPS .ALIGN和内存寻址
- 18. 内存地址
- 19. Mac Pro 64位寻址内核
- 20. 内存管理[寻呼]
- 21. CUDA共享存储器寻址
- 22. 直接映射缓存字节寻址
- 23. 直接存储器寻址模式
- 24. 寻址存储器中的数据
- 25. 寻址QTableWidget Colums
- 26. 相对寻址
- 27. 寻址用C
- 28. LUA表寻址
- 29. C++内存地址?
- 30. 机器内存地址的内存地址? (C语言)
非常感谢回答。 那么exploit(基于缓冲区溢出)如何在shellcode的起始地址必须覆盖返回地址并且我们不能依赖它们的堆栈上运行shellcode(假设没有保护)。这怎么可能?这是我不能得到的东西。 – nore 2010-12-09 23:08:09
是的,但问题是:如果我不重定向返回地址执行它,如何运行test_esp。我必须先知道一个地址。例如,我不能在远程计算机上的漏洞程序中使用“gdb-it”。一个普遍的问题:众所周知的漏洞利用工具是如何工作的。让他们有一个返回地址的常量变量?我问得太多,但我认为这是差距正在下降。我需要一个指导,但如果你能回答我,我会很感激。 ty再次 – nore 2010-12-09 23:32:41