我是靠谱客的博主 动人季节,最近开发中收集的这篇文章主要介绍高级栈溢出技术—ROP实战(split)预备知识实验目的实验环境实验步骤一实验步骤二实验步骤三,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 预备知识
    • 关于ROP
    • 本系列rop实战题目的背景
    • split涉及知识点
  • 实验目的
  • 实验环境
  • 实验步骤一
  • 实验步骤二
  • 实验步骤三

预备知识

关于ROP

ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。
ROP是一种攻击技术,其中攻击者使用堆栈的控制来在现有程序代码中的子程序中的返回指令之前,立即间接地执行精心挑选的指令或机器指令组。

本系列rop实战题目的背景

来自ROPEmporium,旨在通过解决一系列挑战来一步步进阶学习ROP利用技术。

split涉及知识点

1)radare2使用(相关专栏:radare2实战)。
2)汇编程序(阅读、分析,要求熟悉相关指令、寄存器等)。
3)gdb使用。
4)ROPGadget使用。
5)pwntools使用(相关实验:基于pwntools编写pwn代码)。

实验目的

通过该实验学习ROP概念及其思路,了解高级栈溢出时需要注意的事项,并掌握解决方法,同时通过练习给出的关卡来增强实践能力。

实验环境

服务器:kali,IP地址:随机分配
题目文件与源码请在实验机内下载使用:http://tools.hetianlab.com/tools/ROP/2.zip

实验步骤一

这一关是split。
先使用file split命令看一下:
在这里插入图片描述

checksec split

在这里插入图片描述
可以看到nx enabled,即开启了NX,也就是栈不可执行。
先载入r2分析:

r2 -AAA ./split

在这里插入图片描述

实验步骤二

使用afl列出涉及的函数:
在这里插入图片描述
看到了三个可能是比较重要的函数。
main:开始分析的地方。
pwnme,usefulfunction:提示的这么明显了。
先反汇编main:

pdf @ main

在这里插入图片描述
在上图中注意到其调用了pwnme。
所以我们顺着分析pwnme。
同样反汇编:

pdf @ sym.pwnme

在这里插入图片描述
从上图可以看到有一个32字节的缓冲区,可以通过fgets接收96字节的输入从而溢出,也是和上一题ret2win一样溢出rip吗?

实验步骤三

我们先使用gdb分析:
在这里插入图片描述
然后往input中写入随机的100字节的序列:

pattern_create 100 input

在这里插入图片描述
将input作为输入运行:
在这里插入图片描述
然后pattern_search:
在这里插入图片描述
可以看到溢出rsp需要40个字节,我们可以尝试通过调用其他函数吗,比如usefulfunction?
我们回到r2反汇编usefulfunction:

r2 -AAA ./split

在这里插入图片描述
我们可以看到它调用将执行/bin/ls的system()函数。
这个函数的地址是0x00400807,所以我们需要40个字节的随机数据和这个地址。
简单的使用python生成exp写入input。

python2 -c 'from pwn import *;print("A" * 40 +p64(0x00400807))' > input

在这里插入图片描述
然后在gdb中测试:
在这里插入图片描述
可以看到成功执行了/bin/ls。
不过我们的目标是打印flag,而不是ls,所以继续研究下去。
回到r2中使用izz列出字符串:
在这里插入图片描述
我们在其中看到了:
在这里插入图片描述
可以打印flag的字符串。
这个字符串的地址是0x0001060。
现在我们尝试溢出栈,直接执行到system()。
不过我们要找到一个办法,直接将这个地址传入RDI寄存器(x86-64传参时依次通过rdi,rsi……传参,rdi是第一个)。
这时候我们就需要ropgadget了,简单地说,它们就是写以ret指令结尾的指令序列:

ROPgadget --binary ./split --only "pop | ret"

在这里插入图片描述
找到了很多gadget,那么哪个符合要求呢。
我们前面提到必须将值传入RDI,所以要找到pop rdi。
所以符合要求的是地址是0x400883。
我们传递这个gadget地址(0x400883)后,它会把栈中下一个值传到RDI寄存器中,所以下一个地址应该是能够打印flag的字符串的地址(0x601060),最后是system()函数的地址(0x400810)。
使用python简单地将exp输出到input:

python2 -c 'from pwn import *;print("A" * 40+p64(0x0400883) + p64(0x00601060)+p64(0x00400810))' > input

在这里插入图片描述
在gdb中测试,可以看到成功打印出flag:
在这里插入图片描述
同样也可以通过pwntools快速写一个exp,完整代码在2.py。
运行如图:
在这里插入图片描述

最后

以上就是动人季节为你收集整理的高级栈溢出技术—ROP实战(split)预备知识实验目的实验环境实验步骤一实验步骤二实验步骤三的全部内容,希望文章能够帮你解决高级栈溢出技术—ROP实战(split)预备知识实验目的实验环境实验步骤一实验步骤二实验步骤三所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部