程序集返回地址替换



我已经看到,通过替换堆栈上的返回地址,可以使EIP指向堆栈中的地址。
但是,例如,JMP需要程序员在段之间进行远距离跳跃时指定代码段。替换退货地址后会发生什么情况?CS会改变吗?

far call/far ret也存在,以及您提到的far jmp,但也没有人使用它们。 (所有主流操作系统都使用平面内存模型,其中cs是恒定的。

任何正常的编译器生成的代码都将使用接近ret,因此它只会弹出EIP/RIP,而不是更宽的值进入CS:EIP


如果您希望漏洞利用在 32 位进程中切换到操作系统的 64 位用户空间代码段选择器值(反之亦然(,则必须获得足够的控制权才能在有效负载中运行 far jmp/call/ret,或者跳转到作为另一条指令的一部分存在于某处或可执行页面上的数据中

请注意,在某些情况下,操作系统可能不会保留修改后的cs。 例如,调用 Linux 系统调用的某些方法cs内核的__USER32_CS常量。

最新更新