记录这个题不是因为类型混淆,而是学到了一个利用修改object的Properties来实现任意地址读写的手法
题目中的类型混淆会导致可以将一个错误类型的数据无感的写到某个位置,通过这个漏洞可以轻松的实现addressof和fakeobject,但是由于泄露不出来map所以后续不知道该怎么伪造object。
方法是从这里学到的:
https://erosjohn.github.io/2020/05/31/34c3-v9/
手法大概就是,首先有一个object和一个ArrayBuffer,然后object里放上一个键值对,方便的形式如下
var o = {
c : 1.1
};
o.d = 2.2;
然后先把o.d改成arraybuffer的地址,此时原本的2.2被替换成了arraybuffer的地址,然后再把o.d替换成一个object,就叫他target吧,此时原本2.2的位置刚好就是target的properties字段,注意这里的替换不是正经替换,必须是无感的通过此漏洞直接将o.d的位置写成target的地址,其他任何数据都不扰动。
经过上述手段构造出来的结构,当我修改target里的某个键值对的时候,就可以达到直接修改arraybuffer内部结构的效果,如果修改的是backing store,则实现了从addressof和fakeobject进化到任意地址读写。