我已经看到,通过替换堆栈上的返回地址,可以使EIP
指向作为堆栈一部分的地址。
但是,例如,JMP
需要程序员在段之间进行远程跳转时指定代码段。更换返回地址会发生什么? CS
会改变吗?
far call
/ far ret
以及你提到的far jmp
也存在,但也没有人使用它们。 (所有主流操作系统都使用平坦的内存模型,其中cs
是常量。)
任何正常的编译器生成的代码都将使用near ret
,因此它只会弹出到EIP
/ RIP
中,而不是CS:EIP
中更宽的值。
如果你希望你的漏洞利用在32位进程中切换到操作系统的64位用户空间代码段选择器值(反之亦然),那么你将需要获得足够的控制来运行far jmp
/ call
/ ret
在您的有效负载中,或跳转到某个地方存在的另一个指令或可执行页面上的数据。
请注意,在某些情况下,操作系统可能无法保留您修改过的cs
。 For example, some ways of invoking Linux system calls set cs
to the kernel's __USER32_CS
constant.