SROP
First Post:
Last Update:
Word Count:
Read Time:
Page View: loading...
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函数