SROP


SROP


Sigret原理

恢复如果 Linux 内核确定某个进程有一个未阻塞的信号等待处理,那么当该进程下一次从内核态转换回用户态时(例如,从系统调用返回时或当进程被重新调度到 CPU 上时),它会创建用户空间堆栈、或定义的备用堆栈上的一个栈帧,用于保存各种进程上下文(处理器状态字、寄存器、信号掩码和信号堆栈设置)。因此我们可以避开前两个阶段直接去使用系统调用号来恢复系统。这种攻击方式需要的提供写入大小也有一定限制,因为要写入frame的大小。


例题

选用一下buuoj下的ciscn_2019_s_3,可以看到它提供了gadget分别是15号和59号,我们这里的sigret是15号,同时也提供了syscall的函数,因此我们只需要去写入一个/bin/sh的位置就可以了:

接下来只要写入/bin/sh,vuln()函数提供了我们写入和泄露栈的机会,我们可以看到buf和rbp的距离是0x10,同时直接是ret而不是leave&ret,因此我们会leak出0x20的栈上地址。

我们可以去调试一下发现main函数和/bin/sh的相对偏移位置,在我的本机上是0x128,在远程的机子上是0x118。

接下来我们就可以构造payload,注意在python3下,我们要先设置context.arch = “amd64”,同时以字节的形式发送:



文章作者: Dydong
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Dydong !
  目录