Rop-Ret2Text介绍及实例教学

1、前提知识

什么是Rop系统攻击

是一种新型的基于代码复用技术的攻击,攻击者从已有的库或可执行文件中提取指令片段,构建恶意代码。

ROP也有其不同于正常程序的内在特征:

(1)ROP控制流中,call和ret指令不操纵函数,而是用于将函数里面的短指令序列的执行流串起来,但在正常的程序中,call和ret分别代表函数的开始和结束;

(2)ROP控制流中,jmp指令在不同的库函数甚至不同的库之间跳转,攻击者抽取的指令序列可能取自任意一个二进制文件的任意一个位置,这很不同于正常程序的执行。比如,函数中部提取出的jmp短指令序列,可将控制流转向其他函数的内部;而正常程序执行的时候,jmp指令通常在同一函数内部跳转。

ROP攻击的防范:ROP攻击的程序主要使用栈溢出的漏洞,实现程序控制流的劫持。因此栈溢出漏洞的防护是阻挡ROP攻击最根源性的方法。如果解决了栈溢出问题,ROP攻击将会在很大程度上受到抑制。

BSS段通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS段属于静态内存分配。(在溢出时EIP的值可以是BSS段的地址)

data通常存放程序中已经初始化的全局变量的一块内存区域。数据段属于静态内存分配。

text是存放程序执行代码的一块内存区域。称为代码段。

rodata是存放c中的字符串和#define定义的常量。

ret2text就是执行程序中已有的代码,例如程序中写有system等系统的调用函数,我们就可以利用控制已有的gadgets(以ret及结尾的指令序列,通过这些指令序列,可以修改某些地址的内容)控制system函数。其实就是控制程序执行程序本身已有的代码(.text),使EIP指向具有system(“/bin/sh”)的代码段

找到溢出位置,计算偏移量,执行可执行代码, ”呯“

如何快速定位栈溢出,ida + f5,就是看反汇编找找数组定义的位置

我们要要注意的是 gets(buf)、strcpy(dest,sec)、scanf("%s",buf)、stract(buf,buf2)、read(0,buf,size)

测试溢出点,我们要使用cyclic,生成有数量的长度的字符串

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_字符串

然后r程序时,输入这些字符串,我们可以看到报错

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_字符串_02

cyclic -l 0x6161616c

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_偏移量_03

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_pwn_04

6161616c呢也就是 aaal 也就是从我们刚才cyclic生成的字符串中,查找aaal的偏移量

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_字符串_05

如果大家如果我的​​上一篇博客​​的话,我们当时利用的是stack来查看的,之后我们就用cyclic来使用,而利用stack一行一行的算,也就是这个工具的理解。

安装gdb-peda的教程我之前发过

​之前的文章,有gdb的基本使用和插件peda的下载教程​

补充:pwndbg和peda的切换

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_偏移量_06

/是根目录,~是home目录,Linux存储是挂载的方式,相当于是树状的,源头是“/”,也就是根目录。而每个用户都有“home”目录,也就是用户的个人目录,比如用户的“home”目录就是/root,普通用户a的home目录就是/home/a,之后我们可以看到

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_偏移量_07

本次实验编译指令

gcc -no-pie -fno-stack-protector -zexestack -m32 -o -read -read.c

意思就是没有pie保护,有canary保护,栈可执行,32位文件,输出叫read的程序,用read.c的文件

我们打开gdb,发现是peda插件了,然后用创建一个字符串,开始程序,输入,程序出现异常重点,根据程序的报错地址,查询一下偏移量,也就是下图的操作

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_字符串_08快速确定偏移

工具一 gdb-pwndbg

cyclic 200

cyclic -l 地址

工具二 gdb-peda

pattern create 200

pattern offset 地址

功能是一样子的

2、实例教学

问题解析:

控制返回地址->控制执行流程

溢出到返回地址->到底需要输入多少数据

实际操作:

1、找出溢出点

2、确定溢出偏移

3、找到system(“”)函数

4、写exp(烦死了)

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_pwn_09

找system函数

objdump -t xxx 查看程序中使用到的函数

objdump -d xxx 查看程序中函数的汇编代码

objdump -d -j .plt xxx 查看plt表

​什么是plt表​

-j 参数  
.text -代码段
.const -只读数据段(有的编译器不用这个段,将只读并入了.data段)
.bss -bss段

objdump -d -M intel xxx 查看程序中函数的汇编代码,并且汇编代码是intel架构的

实战开始

切记我们的流程哦

第一步的核心是找到system函数

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_控制流_10

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_偏移量_11

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_控制流_12

我们就要想办法调用system函数

现在我们来分析一下具体用到了什么参数,也就是上图红框上面的的地址,更重要的上方的参数地址

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_偏移量_13[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_字符串_14[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_偏移量_15

这个时候再找到刚才我们看的system上方参数的地址

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_偏移量_16

开始写exp

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_偏移量_17

解释:

导入pwn包

偏移量是我们上面算出来的

payload是填充量+覆盖到的地址

向溢出点发送payload

获取交互环境

getshell

[PWN][进阶篇]Rop-Ret2Text介绍及实例教学_pwn_18

希望大家有所收获!!!!