目录
一、基本思路
1.checksec一下
什么保护都没有开启,目测是个简单题,其实就是个简单题,初步判定栈溢出的ret2text吧,后续再看情况
2.ida分析一下
先进主函数看一下,有个gets()危险函数,然后发现fun函数直接把后门(即直接运行了system("/bin/sh"))给我们了,这个时候思路就很清晰了,构造payload运行fun函数就可以达到目的。
主函数里面,定义了一个s变量,后面空间一看就是F=15,而gets危险的原因在于其输入没有上限,所以容易利用其栈区空间。
而我们的fun函数的地址也直观出现在ida里面了0x401186,当然,这不是唯一获取函数地址的办法,大家可以在后续的学习中慢慢体会
以上,我们的基本分析工作就结束了。
二、构造exp
1.ret2text导引
首先,大家想象一个栈空间,就从下往上一格一格的摞起来的,我们的输入都从最底层开始压入,而栈空间的每一个部分都有其专属的作用,这一点大家可以专门找文章了解一下,不多赘述。
ret2text的利用原理就是我们把栈空间调用函数的位置输入我们想运行的函数,从而达到我们进入后门获取shell的目的。
2.exp代码展示
浅说一下这个payload,我们要用任意字符将s的空间填满,达到我们溢出的空间,但是栈区还有一个rbp/ebp需要我们填充才能溢出,前面checksec知道这是64位程序,故rbp需要八个字节填充,这里我使用15+8个字节填充了栈空间,然后发送我们后门函数的地址
#!/usr/bin/python3 ##这个是我使用虚拟机里面python的地址,大家自行调整
from pwn import*
io=remote("node5.buuoj.cn",端口)
payload=b'a'*(15+8)+p64(0x401186)
io.sendline(payload)
io.interactive()
3.运行结果
咱一看,不对劲,没有打通,看似简单题嘛,找了找原因,发现有个堆栈平衡的原因在里面,我们利用p64发送数据的时候,发送的是字节流,也就是比特流,所以我们在payload里面p64(0x401186+1),这个时候再打一下就能打通了
我们用新的payload(其实就是加了个1)打一下,ls发现了flag文件,cat一下就行了
三、 小结一下
其实这里这个堆栈平衡我一直都有疑惑,看了很多文章也没用弄明白为什么这里为了堆栈平衡要+1,只能说还有待学习。
总的来说,ret2text的思路就是最简单的吧(大概),就是利用了危险的无输入上限函数栈溢出,然后利用程序的自带后门解题。