常回家看看之off_by_one

❗off_by_one这个漏洞比较特殊,它不像上一期的堆溢出,可以溢出很多字节,它只能溢出一个字节,在栈里面也可以通过这个漏洞修改返回地址什么的,在堆里面我们主要利用它来修改堆块的大小形成fake_chunk也就可以进行堆的重叠,在64位的时候如果申请0x18,0x28,0x38这样的堆它的size位是0x21,0x31和0x41,那为什么,头部0x10加申请的0x18大小已经是0x28大小了为啥size还是0x21,别忘了,当上一个chunk正在使用的时候下一个chunk的prev_size位也拿来当我们的数据部分。

那么我们就可以利用这个特性来进行off_by_one,那样就可以修改下一个chunk的size位。

我们拿一道题目来具体复现一下这个漏洞。✅

题目链接:https://pan.baidu.com/s/1BBT95PNOuffZv1r_1Cacbg?pwd=kj9t
提取码:kj9t

1.养成好习惯首先看保护

3419447-20240520190845849-524487537

2.不如不看🙃,哈哈,开玩笑的,保护全开,但是不要慌,对于堆题目这很正常,我们用64位ida看一下

3419447-20240520191026288-169896448

3419447-20240520191446287-2046407423

3.还是一些功能函数,add添加chunk

3419447-20240520191840903-1267124445

4.edit函数

3419447-20240520191929824-1611380561

这里主要在输入size的时候进行了一次判断,就是sub_E3A这个函数

3419447-20240520192030882-1418484235

如果输入的size减去申请chunk的size等于10的话会返回a1加1,也就是我们在chunk size的基础上可以多输入一个字节,满足off_by_one

5.show函数和delete函数

3419447-20240520192550050-333329489

我们先申请两个chunk,第一个是0x18,0x28,0x38之类的

3419447-20240520193129898-1477590147

现在编辑第一个堆进行溢出一个字节修改下一个chunk的size位

3419447-20240520193309126-1467934739

修改之前

3419447-20240520193407886-1794926709

修改之后

3419447-20240520193451595-1235718211

3419447-20240520193748168-1655975698

注意此时虽然修改成功了,但是堆结构被我们破坏了,top chunk距离上一个chunk距离不是0x40了,所以我们继续申请一个堆,来恢复堆结构

3419447-20240520194517228-463098578

恢复之后此时堆结构

3419447-20240520201940088-463770924

之后我们把chunk1 free掉

3419447-20240520202410554-1350812995

3419447-20240520202841301-1425173380

我们再次申请回来,发现原来的0x91不见了

3419447-20240520203216796-374983126

那么我们再次构造unsortbin chunk

3419447-20240520203336285-12755324

3419447-20240520203512640-591901248

我们free2 的时候就会得到unsortbin,但是记得再申请一个堆,不然free的时候会和top chunk合并

3419447-20240520203653485-1583472558

3419447-20240520203920652-1686364780

在2.23版本里面泄露出的地址-0x58就是main_arena的地方而main_arena-0x10就是__malloc_hook地址

3419447-20240520204048024-728234753

然后这里使用fatsbin attack 申请到_malloc_hook和recalloc_hook附近修改它们的值,(一般都是__malloc_hook-0x23)

因为这里符合size的结构

3419447-20240520204342472-1588758804

这里要注意并不是修改__malloc_hook为one_gadget就可以getshell,通常可以使用****realloc_hook 调整栈帧使 onegadget 生效

将 malloc_hook 劫持为 realloc ,realloc_hook 劫持为 onegadget ,实际运行顺序:

1
malloc -> malloc_hook -> realloc -> realloc_hook -> onegadget

这样就能经过 realloc 调整栈帧后再运行 onegadget 。但是实际情况中,并不是直接劫持 malloc_hook 为 realloc ,而是要加上一定的偏移,也就是调整 push 的数量,让栈帧结构满足 onegadget 运行

3419447-20240520204822714-1846554124

最后放上exp: 代码还是有点多的

3419447-20240520204922743-127383576

3419447-20240520205049154-2010944746


常回家看看之off_by_one
https://ch13hh.github.io/2024/06/22/常回家看看之off_by_one/
发布于
2024年6月22日
许可协议