《黑客:剥削的艺术》中跨进程返回地址计算逻辑的疑问
缓冲区溢出中父子进程栈地址近似的原因
- 关闭ASLR后,同一个程序的父子进程虚拟地址空间布局完全一致——内核会给它们分配相同范围的虚拟地址,只是背后映射的物理内存页不同。
- 你调试时看到的父子进程栈地址微小差异(比如0xffffd02c和0xffffd04c),是因为
fork()后子进程会执行少量额外的初始化操作,导致栈指针有固定的小偏移,这个偏移量在相同环境下是稳定的。 - 作者用
(unsigned int) &i - offset计算返回地址,是拿父进程栈上变量的地址,减去一个经验偏移量来估算子进程的栈地址。再配合足够长的NOP滑条,就算估算地址和子进程shellcode的实际地址有小偏差,CPU也会顺着NOP滑条一路滑到真正的shellcode上,完成执行。 - 你遇到的0x20字节偏移,就是子进程初始化带来的栈变化,只要NOP滑条长度超过这个偏移量,就能覆盖误差,让返回地址命中滑条区域。
内容的提问来源于stack exchange,提问作者noob_user
相关产品推荐
相关产品推荐

