-
-
[原创]第九题 C与C++
-
发表于:
2019-3-23 13:36
6236
-
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
[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!
最后于 2019-3-25 12:43
被大帅锅编辑
,原因: