Ret2Text的局限:上节课,学习了Ret2Text,在编写Exp时依赖程序本身中存在system("/bin/sh")函数,那如果我们要分析的程序中没有调用这个函数呢?
针对这个问题,我们可以使用ret2shellcode、ret2libc、ret2csu、ret2syscall、stack pivot、ret2dl_resolve这些方法
今天我们来学习Ret2Shellcode
基础知识
1、Ret2Shellcode利用条件
- 程序本身没有执行shell的函数
- 需要程序没有开启NX保护
2、Linux系统调用
- 所有的操作系统在其内核里都有一些内建的函数,这些函数可以用来完成一些系统级别的功能。
- Linux系统使用的这样的函数叫做“系统调用”,英文是systemcall
- 这些函数代表了从用户空间到内核空间的一种转换,例如在用户空间调用open函数,则会在内核空间调用sys_open。
- 每个系统调用都有一个定义好的数字,这些数字是用来构造这些系统调用的
- 内核通过0x80中断来管理这些系统调用,这些系统调用的对应的数字和一些参数都在调用的时候送到某些寄存器里面
- 系统调用的数字实际上是一个序列号,表示其在系统的一个数组sys_call_table[]中的位置
- 系统调用可以在此文件中看到:/usr/include/x86_64-linux-gnu/asm/unistd_32.h
3、如下图,是编写Shellcode会用到的一个模板。将要用到的系统调用号传入eax中,将要用到的参数按如下图传入到对应的寄存器中,随后,通过int 0x80来陷入核心,参数也将通过寄存器传往核心
对int 0x80的详细理解请参考文章: