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

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

Rop-Ret2Text介绍及实例教学

1、前提知识

2、实例教学


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,生成有数量的长度的字符串

image.png

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

image.png

cyclic -l 0x6161616c

image.png

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

image.png

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


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

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


补充:pwndbg和peda的切换

image.png

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

image.png

本次实验编译指令

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

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


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

image.png

快速确定偏移

工具一 gdb-pwndbg

cyclic 200

cyclic -l 地址

工具二 gdb-peda

pattern create 200

pattern offset 地址

功能是一样子的

2、实例教学

问题解析:

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

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


实际操作:

1、找出溢出点

2、确定溢出偏移

3、找到system(“”)函数

4、写exp(烦死了)

image.png

找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函数

image.png

image.png

image.png

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


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

image.png

image.png

image.png

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

image.png

开始写exp

image.png

解释:

导入pwn包

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

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

向溢出点发送payload

获取交互环境

getshell

image.png


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

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
8月前
|
搜索推荐 C++ Windows
[学习][笔记]C++/WinRT入门 01Hello world
[学习][笔记]C++/WinRT入门 01Hello world
|
10月前
|
Linux
攻防世界-Reverse新手区WP--maze
攻防世界-Reverse新手区WP--maze
44 0
|
前端开发 rax Shell
[PWN][高级篇]ROP-ret2libc-32/64位实例 (共四个)(上)
[PWN][高级篇]ROP-ret2libc-32/64位实例 (共四个)
725 0
[PWN][高级篇]ROP-ret2libc-32/64位实例 (共四个)(上)
|
Java
Continue与Break在使用过程中的爱恨情仇| Java Debug 笔记
Continue与Break在使用过程中的爱恨情仇| Java Debug 笔记
90 0
|
Shell Linux
[PWN][进阶篇]ROP_Ret2Shellcode-32实例(下)
[PWN][进阶篇]ROP_Ret2Shellcode-32实例
148 0
[PWN][进阶篇]ROP_Ret2Shellcode-32实例(下)
|
Linux
[PWN][进阶篇]ROP-Ret2Shellcode-64位实例(下)
[PWN][进阶篇]ROP-Ret2Shellcode-64位实例
215 0
[PWN][进阶篇]ROP-Ret2Shellcode-64位实例(下)
|
前端开发 rax Shell
[PWN][进阶篇]ROP-Ret2Shellcode-64位实例(上)
[PWN][进阶篇]ROP-Ret2Shellcode-64位实例
374 0
[PWN][进阶篇]ROP-Ret2Shellcode-64位实例(上)
|
安全 Shell Linux
[PWN][进阶篇]ROP_Ret2Shellcode-32实例(上)
[PWN][进阶篇]ROP_Ret2Shellcode-32实例
169 0
[PWN][进阶篇]ROP_Ret2Shellcode-32实例(上)
[PWN][高级篇]ROP-ret2libc基础知识
[PWN][高级篇]ROP-ret2libc基础知识
425 0
[PWN][高级篇]ROP-ret2libc基础知识