ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-03-22 15:03:05  阅读:278  来源: 互联网

标签:Ret2Text 函数 ROP 程序 system 进阶篇 地址 Rop 溢出


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,生成有数量的长度的字符串
在这里插入图片描述
然后r程序时,输入这些字符串,我们可以看到报错
在这里插入图片描述

cyclic -l 0x6161616c

在这里插入图片描述
在这里插入图片描述
6161616c呢也就是 aaal 也就是从我们刚才cyclic生成的字符串中,查找aaal的偏移量

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

安装gdb-peda的教程我之前发过
之前的文章,有gdb的基本使用和插件peda的下载教程

补充:pwndbg和peda的切换

在这里插入图片描述
/是根目录,~是home目录,Linux存储是挂载的方式,相当于是树状的,源头是“/”,也就是根目录。而每个用户都有“home”目录,也就是用户的个人目录,比如用户的“home”目录就是/root,普通用户a的home目录就是/home/a,之后我们可以看到
在这里插入图片描述
本次实验编译指令

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

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

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

在这里插入图片描述快速确定偏移
工具一 gdb-pwndbg
cyclic 200
cyclic -l 地址
工具二 gdb-peda
pattern create 200
pattern offset 地址
功能是一样子的

2、实例教学

问题解析:
控制返回地址->控制执行流程
溢出到返回地址->到底需要输入多少数据

实际操作:
1、找出溢出点
2、确定溢出偏移
3、找到system(“”)函数
4、写exp(烦死了)

在这里插入图片描述
找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函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们就要想办法调用system函数
现在我们来分析一下具体用到了什么参数,也就是上图红框上面的的地址,更重要的上方的参数地址

在这里插入图片描述在这里插入图片描述在这里插入图片描述这个时候再找到刚才我们看的system上方参数的地址

在这里插入图片描述开始写exp
在这里插入图片描述解释:
导入pwn包
偏移量是我们上面算出来的
payload是填充量+覆盖到的地址
向溢出点发送payload
获取交互环境

getshell

在这里插入图片描述
希望大家有所收获!!!!

标签:Ret2Text,函数,ROP,程序,system,进阶篇,地址,Rop,溢出
来源: https://blog.csdn.net/m0_46363249/article/details/115066971

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有