装配返回地址替换

时间:2017-11-17 23:04:57

标签: assembly x86 exploit

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

1 个答案:

答案 0 :(得分:1)

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

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

如果您希望您的漏洞利用在32位进程中切换到操作系统的64位用户空间代码段选择器值(反之亦然),那么您将需要获得足够的收益控制在您的有效负载中运行far jmp / call / ret,或者跳转到某个地方或某个可执行页面上的数据中存在的那个。

请注意,在某些情况下,操作系统可能无法保留您修改的csFor example, some ways of invoking Linux system calls set cs to the kernel's __USER32_CS constant.