ret2syscall
原理
顾名思义,ret to syscall,就是调用系统函数以达到getshell的目的
在计算中,系统调用是一种编程方式,计算机程序从该程序中向执行其的操作系统内核请求服务。这可能包括与硬件相关的服务(例如,访问硬盘驱动器),创建和执行新进程以及与诸如进程调度之类的集成内核服务进行通信。系统调用提供了进程与操作系统之间的基本接口。
至于系统调用在其中充当什么角色,稍后再看,现在我们要做的是:让程序调用execve(“/bin/sh”,NULL,NULL)函数即可拿到shell
相关扩展——gadgets
gadgets可以理解为代码段或者汇编指令
获取gadgets的方式:
指令:
ROPgadget --binary 文件名 --only 'pop|ret' |grep '寄存器名'
ROPgadget --binary 文件名 --only 'int'
ROPgadget --binary 文件名 --string '/bin/sh'
例行检查(32位,开启nx保护)
因为该程序是 32 位,所以:
- eax 应该为 0xb( 0xb 是execve 对应的系统调用号)
- ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以
- ecx 应该为 0
- edx 应该为 0
- 最后再执行int 0x80触发中断即可执行execve()获取shell
接下来利用ida检查程序,先查看main函数的伪代码(gets函数有溢出危险)
再查看字符串(明显得出没有system,shellcode,存在bin/sh但没有使用) 计算偏移量,生成有规律的垃圾数
使用gdb进行调试 (打断点然后运行)
输入c继续运行 ,输入随机数,得到返回地址
得到偏移量
寻找寄存器 地址(eax/ebx,ecx,edx)
寻找int 0x80的地址 寻找bin/sh地址
(1)ida(从字符串找到bin/sh进行双击即可得到)
(2)虚拟机终端
编写exp即可
![](https://i-blog.csdnimg.cn/blog_migrate/787de05b2874536a2ed7b96e2513c2f0.png)
ciscn_2019_n_5
ret2shellcode
即控制程序执行 shellcode 代码。shellcode 指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的 shell。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。
在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。
利用关键
1、程序存在溢出,并且还要能够控制返回地址
2、程序运行时,shellcode 所在的区域要拥有执行权限(NX保护关闭、bss段可执行)
3、操作系统还需要关闭 ASLR (地址空间布局随机化) 保护 。(或关闭PIE保护)
扩展——asm、shellcraft
asm函数是对某个内容进行汇编
shellcraft:shellcraft是pwntools中的一个模块,是shellcode的生成器,我们可以使用shellcode = asm(shellcraft.sh())来生成shell。需要注意的是,对于不同的平台(AMD、Intel),不同位数的机器(32位、64位)的shellcode不一样,所以在使用shellcraft之前要设置好context。
read函数
在read()函数里,有Linux给出的定义
NAME read - read from a file descriptor
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符,用来指向要操作的文件的文件结构体
buf:一块内存空间
count:希望读取的字节数
返回值表示实际读到的字节数(字符串结束符 '\0'不算)
例行检查(64位,没有开任何保护)
进入ida检查源码,先f5查看main函数的伪代码 通过read函数编写shellcode,text可溢出,通过text溢出到read执行shellcode
(要求name有可执行权限)
由于buf可读可写可执行,所以name有可执行权限
查看name权限的方法
查看name地址
查看偏移量
编写exp解题
jarvisoj_level2
例行检查(32位,开启了nx保护)
ida中进行分析,查看字符串(发现system和bin/sh不在一起)
使用rop传参,构造system(‘/bin/sh’),32位架构所有参数直接使用栈来传递
查看main函数伪代码,双击vulnerable_function函数查看
read函数中v1只有136个字节,读入的数据大小为256,可溢出120个字节,足够构造rop,偏移量即为136=0x88
bin/sh地址
system地址 编写exp