SROP

First Post:

Last Update:

Word Count:
484

Read Time:
1 min

Page View: loading...

高级ROP-SROP

之前一直没掌握SROP技术,以此篇重新学习一下SROP

利用工具

在目前的pwntools中已经集成了对于srop的攻击。

使用情况

在汇编代码中看到存在systemcall的时候可以考虑采用该方法进行尝试

下面给出我们将会用到的64位函数及函数调用号和函数原型

系统调用 调用号 函数原型
read 0 read( int fd, void *buf, size_t count )
write 1 write( int fd, const void *buf, size_t count )
sigreturn 15 int sigreturn( … )
execve 59 execve( const char *filename, char *const argv[], char *const envp[] )

###使用sigreturn对read函数调用的寄存器进行部署
接下来就需要注意了,我们进入构造的阶段。我们需要通过sigreturn的调用来实现对read函数调用寄存器的部署。值得高兴的是pwntools中已经有了调用sigreturn的功能,所以在写EXP的时候可以直接使用。再部署之前我们需要之想好在哪几个寄存器中部署什么值,下面列出来一一讲解

寄存器和指令 存储数据
rax 系统调用号
rdi 0
rsi addr
rdx len
rsp addr
rip syscall_ret

首先是rax寄存器中一定是存放read函数的系统调用号啦,因为原汇编代码使用的是syscall,这个不多说了
●rdi寄存器作为read函数的一参,0代表标准输入
●rsi寄存器作为read函数的二参,里面存放的是前面通过write函数打印出来的新栈顶的地址,也就是说将接收到的信息写到我们前面通过write函数打印的新栈顶的位置
●rdx作为read函数的三参写0x400个字节
●rsp寄存器需要和rsi保持一致,在写的时候写在rsp指向的位置
●rip寄存器指向syscall_ret,确保在read函数寄存器部署成功之后可以直接调用read函数