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