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

[原创]第九题 C与C++

2019-3-23 13:36
6189

1.思路

貌似got表可写,但实际都没用到,难道是非正规的解法

程序的漏洞点就在这个地方
delete一个堆就会计算这个堆的大小
然后就会调用这个堆后面的某个地方。
不知到作者这么设计的用意。

2.正文


程序的漏洞点就在这个地方
delete一个堆就会计算这个堆的大小
然后就会调用这个堆后面的某个地方。
不知到作者这么设计的用意。
其实有很多细节的东西在此就不一一阐述了,有问题的地方在下面留言就行了!

申请堆的大小有点恶心,但是是个递增函数不影响写个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()

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