一、ret2syscall(返回到系统调用)
1.系统调用
- 操作系统提供给用户的编程接口
- 是提供访问操作系统所管理的底层硬件的接口
- 本质上是一些内核函数代码,以规范的方式驱动硬件
- x86通过int 0x80指令进行系统调用、amd64通过syscall指令进行系统调用
2.举例:
- 在进行系统调用时,eax中保存的是系统调用号,ebx,ecx..保存系统调用时所需的参数。
- write的系统调用号为4,execve的系统调用号为11,作用为执行第一个参数的命令。
- 系统调用的本质就是一段指令

3.ROP(返回导向编程)
程序中并没有一段连续的汇编代码去实现系统调用,而rop可以将分离的代码片段经过组合达到相同的效果
(1)ret2syscall
篡改栈帧上自返回地址开始的一段区域为一系列gadget的地址,最终完成目标函数的调用
如果文件开启了NX保护,那直接在栈上写入shellcode以获取shell的攻击手法变得难以执行,除了寻找其他可写可执行的段(bss)以期写入shellcode的方法外,还可以考虑利用文件中已有的gaget来改变某些寄存器或者某些变量的值,从而控制程序执行流。
ROP攻击一般需要满足一下条件
- 程序存在溢出,并且可以控制返回地址
- 可以找到满足条件的gagets和相应gagets的地址(静态链接的程序)
1.32位程序
对于32位程序我们需要eax寄存器来存储系统调用号,一般情况下,我们的思路是通过系统调用执行:execve('/bin/sh',null,null),这里需要注意传入的是/bin/sh的地址,然后通过gaget修改ebx,ecx,edx寄存器的值,最后进行系统调用(int 80 指令的地址)
2.64位程序
64位程序的传参方式和32位程序有所不同,若参数小于6个,参数传递利用的寄存器以此为:rdi,rsi,rdx,rcx,r8,r9,除此之外,系统调用号通过rax传递,最后进行系统调用(syscall指令的地址)
1151

被折叠的 条评论
为什么被折叠?



