基本ROP-ret2syscall
原理
ret2syscall就是调用系统函数以达到getshell的目的
在计算机中,系统调用是一种编程方式,计算机程序从该程序中向执行其的操作系统内核请求服务,这可能包括与硬件相关的服务(例如,访问硬盘驱动器),创建和执行新进程以及诸如进程调度之类的集成内核服务进行通信。系统调用提供了进程与操作系统之间的基本接口
因此,我们要做的是:让程序调用execve(“/bin/sh”, NULL, NULl)函数即可拿到shell
攻击步骤
调用此函数的具体步骤如下(32位):
- eax应该为0xb
- ebx应该指向/bin/sh的地址,其实执行sh的地址也可以
- ecx应该为0
- edx应该为0
- 执行int 0x80触发中断即可执行execve()获取shell
系统在运行的时候会使用以上4个寄存器,所以上面的内容我们也可以写为int 0x80(eax, ebx, ecx, edx)。只要我们把对应获取shell的系统调用参数放到对应寄存器中,那么我们再执行int 0x80就可以执行对应的系统调用
而我们如何控制这些寄存器的值?
在学习汇编函数时,最常用的就是push、pop、ret指令,而这里我们将使用pop和ret的组合来控制寄存器的值以及执行方向
1 | pop eax #系统调用号载入,execve为0xb |
这样,寄存器的值就可以控制了,然后使用gadgets让这一连串的pop命令顺序连接执行,最后使用的ret指令,进而控制程序执行流程
示例
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Mandarava23!
评论


