原理

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
2
3
4
pop eax #系统调用号载入,execve为0xb
pop ebx #第一个参数,/bin/sh的string
pop ecx #第二个参数,0
pop edx #第三个参数,0

这样,寄存器的值就可以控制了,然后使用gadgets让这一连串的pop命令顺序连接执行,最后使用的ret指令,进而控制程序执行流程

示例