程序集 Return 地址替换
Assembly Return Address Replace
我看到通过替换堆栈上的 return 地址,可以使 EIP
指向属于堆栈一部分的地址。
但是,例如,JMP
需要程序员在段之间进行远跳转时指定代码段。当您替换 return 地址时会发生什么? CS
有变化吗?
far call
/ far ret
以及您提到的 far jmp
也存在,但也没有人使用它们。 (所有主流 OSes 使用平面内存模型,其中 cs
不变。)
任何正常的编译器生成的代码都将使用 near ret
,因此它只会弹出到 EIP
/ RIP
,而不是更宽的值到 CS:EIP
。
如果你想让你的 exploit 在 32 位进程中切换到 OS 的 64 位用户-space 代码段选择器值(反之亦然),你是将必须获得足够的控制权以 运行 a far jmp
/ call
/ ret
在你的有效载荷中,或者跳转到作为另一条指令的一部分存在于某处或数据中的指令在可执行页面上。
请注意,在某些情况下,OS 可能不会保留您修改的 cs
。
我看到通过替换堆栈上的 return 地址,可以使 EIP
指向属于堆栈一部分的地址。
但是,例如,JMP
需要程序员在段之间进行远跳转时指定代码段。当您替换 return 地址时会发生什么? CS
有变化吗?
far call
/ far ret
以及您提到的 far jmp
也存在,但也没有人使用它们。 (所有主流 OSes 使用平面内存模型,其中 cs
不变。)
任何正常的编译器生成的代码都将使用 near ret
,因此它只会弹出到 EIP
/ RIP
,而不是更宽的值到 CS:EIP
。
如果你想让你的 exploit 在 32 位进程中切换到 OS 的 64 位用户-space 代码段选择器值(反之亦然),你是将必须获得足够的控制权以 运行 a far jmp
/ call
/ ret
在你的有效载荷中,或者跳转到作为另一条指令的一部分存在于某处或数据中的指令在可执行页面上。
请注意,在某些情况下,OS 可能不会保留您修改的 cs
。