我已经看到,通过替换堆栈上的返回地址,EIP
可以指向堆栈中的地址。
但是,例如,JMP
需要程序员在段之间进行远程跳转时指定代码段。更换返回地址会发生什么? CS
会改变吗?
答案 0 :(得分:1)
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.