首页
社区
课程
招聘
[原创] RoarCTF Pwn部分赛题WriteUP
发表于: 2019-10-18 15:52 10511

[原创] RoarCTF Pwn部分赛题WriteUP

2019-10-18 15:52
10511

程序中故意写了个off-by-one。由于程序使用的是calloc需要注意一下申请是会清空chunk的内容。exp如下:

该题考点是realloc的特性,分配0 size的时候会返回0x0。存在uaf。参考这篇文章。exp如下。

程序中存在uaf漏洞,不过只有一个用来存在ptr。然后发现有个build_free,build申请0xa0的size。free也存在uaf。这样其实就想到fastbin double free。先申请一个0xa0大小的chunk。释放会进入unsorted bin。然后用外面的申请两个0x68,两个存放ptr的都指向了0x68的size大小的chunk。然后申请到bss段。用name伪造size。exp如下:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 2
支持
分享
最新回复 (10)
雪    币: 47147
活跃值: (20455)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
将附件也一并提交下,方便学习!
2019-10-18 16:40
0
雪    币: 15191
活跃值: (16857)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
3
有没有详细一点的分析啊,思路什么的
2019-10-19 12:21
0
雪    币: 247
活跃值: (109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我想问一下为什么这里不是直接用onegadget的地址覆盖malloc_hook,反而要覆盖malloc_hook为realloc的地址,用onegadget覆盖realloc_hook呢?
2019-10-19 12:27
0
雪    币: 111
活跃值: (726)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
1wc
5
Freway 我想问一下为什么这里不是直接用onegadget的地址覆盖malloc_hook,反而要覆盖malloc_hook为realloc的地址,用onegadget覆盖realloc_hook呢?
一般来说,是因为直接覆盖malloc_hook为onegadget的几个地址均不符合约束,因为onegadget是通过符号执行找到的,需要堆栈上相应偏移处满足相应的约束。
2019-10-19 13:31
0
雪    币: 247
活跃值: (109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
1wc 一般来说,是因为直接覆盖malloc_hook为onegadget的几个地址均不符合约束,因为onegadget是通过符号执行找到的,需要堆栈上相应偏移处满足相应的约束。
那么为什么在realloc转一圈就可以了。。我gdb跟了一下好像跳到realloc也没干啥。。
2019-10-19 14:05
0
雪    币: 2049
活跃值: (74)
能力值: ( LV3,RANK:31 )
在线值:
发帖
回帖
粉丝
7
百度搜索,自动回到看雪
2019-10-21 10:27
0
雪    币: 1037
活跃值: (1780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
没有附件或者源码也行,分析也没有
2019-10-21 14:44
0
雪    币: 111
活跃值: (726)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
1wc
9
Freway 那么为什么在realloc转一圈就可以了。。我gdb跟了一下好像跳到realloc也没干啥。。
首先,realloc_hook和malloc_hook在libc上紧挨在一起,方便覆盖;其次,用gdb看一下realloc代码,
gef➤  x/32gi 0x00007f8a83cf7000 + 0x846c0
   0x7f8a83d7b6c0 <__GI___libc_realloc>:        push   r15
   0x7f8a83d7b6c2 <__GI___libc_realloc+2>:        push   r14
   0x7f8a83d7b6c4 <__GI___libc_realloc+4>:        push   r13
   0x7f8a83d7b6c6 <__GI___libc_realloc+6>:        push   r12
   0x7f8a83d7b6c8 <__GI___libc_realloc+8>:        mov    r13,rsi
   0x7f8a83d7b6cb <__GI___libc_realloc+11>:        push   rbp
   0x7f8a83d7b6cc <__GI___libc_realloc+12>:        push   rbx
   0x7f8a83d7b6cd <__GI___libc_realloc+13>:        mov    rbx,rdi
   0x7f8a83d7b6d0 <__GI___libc_realloc+16>:        sub    rsp,0x38
   0x7f8a83d7b6d4 <__GI___libc_realloc+20>:        mov    rax,QWORD PTR [rip+0x33f8f5]        # 0x7f8a840bafd0

realloc函数开始有一系列的堆栈操作,包括push和+20处的sub rsp, 0x38, 所以劫持到realloc或者realloc+2/4/6/8/12/20等等开始执行可以控制堆栈的抬高与降低,使得最终执行one_shot时符合栈上[rsp+xxx]=NULL的约束。
2019-10-21 15:32
0
雪    币: 247
活跃值: (109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
1wc 首先,realloc_hook和malloc_hook在libc上紧挨在一起,方便覆盖;其次,用gdb看一下realloc代码, gef➤ x/32gi 0x00007f8a83cf7000 + ...
懂了,我原来还是用的劫持到freehook的方法,没想到还有这种操作,谢谢
2019-10-31 09:47
0
雪    币: 111
活跃值: (726)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
1wc
11
Freway 懂了,我原来还是用的劫持到freehook的方法,没想到还有这种操作,谢谢
不客气哈
2019-10-31 15:49
0
游客
登录 | 注册 方可回帖
返回
//