SROP - Sigreturn-Oriented Programming
Last updated
Last updated
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
Sigreturn
是一种特殊的 syscall,主要用于在信号处理程序完成执行后进行清理。信号是操作系统发送给程序的中断,通常用于指示发生了一些异常情况。当程序接收到信号时,它会暂时暂停当前工作,以通过 信号处理程序 处理信号,这是一种专门设计用于处理信号的函数。
在信号处理程序完成后,程序需要 恢复其先前状态,就像什么都没有发生一样。这就是 sigreturn
发挥作用的地方。它帮助程序 从信号处理程序返回,并通过清理信号处理程序使用的栈帧(存储函数调用和局部变量的内存部分)来恢复程序的状态。
有趣的是 sigreturn
是如何恢复程序状态的:它通过将 所有 CPU 的寄存器值存储在栈上 来实现。当信号不再被阻塞时,sigreturn
从栈中弹出这些值,有效地将 CPU 的寄存器重置为处理信号之前的状态。这包括指向当前栈顶的栈指针寄存器 (RSP)。
从 ROP 链中调用 syscall sigreturn
并 添加我们希望加载到栈中的寄存器值,可以 控制 所有寄存器值,因此 调用 例如 syscall execve
与 /bin/sh
。
注意这将是一种 Ret2syscall 类型,使得控制参数以调用其他 Ret2syscalls 变得更加容易:
Ret2syscall如果你感兴趣,这是 sigcontext 结构 存储在栈中以便后续恢复值(图来自 这里):
为了更好的解释,请查看:
您可以在这里找到一个示例,其中通过 ROP 构造对 signeturn 的调用(将值 0xf
放入 rxa),尽管这只是最终的利用:
检查此处的漏洞,其中二进制文件已经调用了sigreturn
,因此不需要使用ROP来构建它:
允许写入栈的汇编二进制文件,然后调用**sigreturn
系统调用。可以通过sigreturn**结构在栈上写入一个ret2syscall,并读取二进制内存中的标志。
允许写入栈的汇编二进制文件,然后调用**sigreturn
系统调用。可以通过sigreturn**结构在栈上写入一个ret2syscall(该二进制文件包含字符串/bin/sh
)。
64位,无relro,无canary,nx,无pie。简单的缓冲区溢出,利用gets
函数,缺乏执行ret2syscall的gadgets。ROP链通过再次调用gets将/bin/sh
写入.bss
,利用**alarm
函数将eax设置为0xf
以调用SROP**并执行一个shell。
64位汇编程序,无relro,无canary,nx,无pie。流程允许在栈中写入,控制多个寄存器,并调用系统调用,然后调用exit
。所选的系统调用是sigreturn
,它将设置寄存器并移动eip
以调用先前的系统调用指令并运行memprotect
以将二进制空间设置为rwx
并设置ESP在二进制空间中。按照流程,程序将再次调用read到ESP,但在这种情况下ESP将指向下一个指令,因此传递一个shellcode将其写为下一个指令并执行。
SROP用于为放置shellcode的地方提供执行权限(memprotect)。
学习与实践AWS黑客技术:HackTricks培训AWS红队专家(ARTE) 学习与实践GCP黑客技术:HackTricks培训GCP红队专家(GRTE)