哎 我可能已经有一两个月没更新了 我感觉我在不更新 你们肯定觉得这网站凉了吧~

最近我看到很多评论 说我六年级怎么会懂那么多之类的。。。。 其实只要你懂一些计算机底层知识 这一切都不会太难 而且 我也是从一个懵懵懂懂的小白过度过来的 。。。。

好了 画布多烁 我们开始吧

题目解析 jarvisoj_level0

哈哈 熟悉我之前文章的小伙伴可能对这种题目很熟悉 为啥我会重新拉回来讲呢?主要是因为实在没啥好讲的
而且我也非常的累 但是 就和考试一样 如果要巩固一个知识 就要多刷题目 巩固逻辑 而现在 我们会从最简单的一道题目开始
题目来源:BUUCTF (buuoj.cn)

逻辑分析

main函数

打开首次我们打开IDA 也就是反编译软件 它可以把机械码(就是只有机器才读懂的代码)转化成 汇编代码 那么 我们先看一下代码吧

main函数

可以看到 Main函数是一个很简单的输出“Hello World”功能的函数 执行完后 会跳转到 vulnerable_function函数

vulnerable_function函数

vulnerable_function函数*=

在vulnerable_function函数 出现了一个很经典的栈溢出漏洞 也就是read函数的 Read的大小超过了buf变量本身的大小 听不懂?没关系 给你画一个图就懂了;

我们就拿盒子做例子;

image.png
首先 在这里 出现了3个不同的盒子 分别是 Alpha Bravo 和 Delta 或者 呢可以3个盒子组成的主体 看成主体 而不同颜色的箱子 就是不同的分区;那么 这个时候;
3个盒子组成的主体就是 栈 而箱子 则是不同变量所得到的空间 (不完全准确 只是比喻) 我们可以向这个大的盒子(主体)中存放数据(指令但是 这一切没有那么简单 还需要结合这几个特殊的规则;来看,

  1. 在取出数据时 只可以拿最上方的数据
  2. 在放入数据时 这可以往最顶上的数据放叠加
  3. 我们可以通过跳转到特定的地址执行盒子中的特定指令
  4. 在更新数据后 必须再放入包含它下一个跳转的地址的数据 和目前数据最顶端的地址的数据
  5. 在存储的过程中 盒子不会对放入的数量做主动的限制 但是可以通过外部限制来限制放入的大小
  6. 数据可以被其他异常数据覆盖

那么现在结合上面的规则我们需要更改一下图片 那么现在如果我们把盒子的名称跟改成变量的大小一下的话 它长这样
image.png

而这个时候 不同的盒子则是不同的函数调用栈 而rip rbp则是不同的寄存器;
具体可以参考我写的:

好了 我们现在结合题目再
首先 我们知道简单的来说 C语言中Read函数就是把输入的内容写入什么什么变量中 它的使用方法如下:
read(0,指定的函数限制的大小)
那么 这道题中的 read 就是把用户输入的内容写入buf变量中 而且限制输入的内容在 200以内

现在我们再看一下对buf变量的定义

char buf; // [rsp+0h] [rbp-80h]

观察后 你可能就会想问 :什么是[rsp+0h] [rbp-80h]? 其实 不用管那么多 只需要知道就是指这一个变量的规定大小
好了 知道那么多 我们可以开始用图模拟了 那么 题目中的Read所传入的东西长这样:
buf
但是我们我们知道 在题目中的read可以让你输入最多200的内容 但是这个变量buf所拥有的区域只有80是 那么 如果我们输入超过80 会怎么样呢?
假如说 我们现在写如一个94大小的东西会怎么样呢
答案:会覆盖一些原本不因该覆盖的
我们拿图片做以下例子;
假如说 我现在输入一个88的a 那么现在这个区域会成这样:
image.png

这个时候 不仅变量buf被我们修改成了80个a rbp(栈顶)和 rip(下个指令地址)也被我们修改成了 a 我们知道 在栈中 地址都是16进制的方式出现的 那么 这时就会跳转到 0xaaaa的地址所包含的指令
知道了那么多 我们可以开始 写EXP了

EXP编写

image.png

有了思路 那我们懂了;
对了 一般来说 我们会寻找一个system函数+bin/sh字符串来Getshell 但是在这一题中已经有先成的了 所以不需要

exp

from pwn import *
#written by Retromous
r = remote("node4.buuoj.cn",28351)
payload = b'a' * 0x80 + b'b' * 0x8 + p64(0x400596) #getshell函数地址
r.send(payload)
r.interactive()

好了 今天的课程就结束了 Bye!

最后修改:2021 年 09 月 11 日 08 : 29 PM
如果觉得我的文章对你有用,请随意赞赏