今日流水账:
- 把计网实验报告完成了,当然还有点小问题就是PC2=>PC4的测试截图没有
- 看了下V8中是如何实现快速
for in
的,嗯,懵懵懂懂吧,就了解了个enum cache
,其是描述符数组的一个字段,所以其是针对命名属性的,就是把可迭代的命名属性的键和索引存了下来 - 然后看了会垃圾回收机制,有了个大概的了解,但是对应 scavenge 是如何不重复不遗漏的复制对象没有搞得太清楚。然后写屏障还是懵懵懂懂
- 强网杯那道V8的题目漏洞原理看懂了,但是触发漏洞的代码细节没有看懂。然后下午玩了一个小时的手机…悲,然后找了会V8 IR相关的资料,但是没找到,所以又看了会GC,终于明白了Scavenge算法是如何不重复不遗漏的复制对象,主要就是设置了一个forwarding指针去记录对象在复制到to-space中的位置从而避免了重复复制的问题。对于写屏障也基本搞懂了其作用
- 吃完晚饭一直在搞强网杯那题,不会啊…菜死了,现在晚上9点,回宿舍洗个澡,今天晚上一定把这题解决了,艹 ====> 哎,把源码大致看了下,对漏洞的理解已经差不多了,其实跟JIT相关性不是很大,我还一直找JIT相关资料呢,悲。然后把POC写出来了(应该是理解了作者的POC,自己这么菜,怎么可能自己写POC),然后利用就明天写吧
- 其实理解这个漏洞关键要理解 V8 中
for-in
的实现,对于for-in
的实现并没有一个非常准确的规范,但是逻辑其实都差不多,只是遍历顺序不同。在V8中,当使用for-in
语句时,会先收集键信息(包括原型链上的键),然后建立enum cache
。然后在下次访问时,就会直接以enum cache
为源进行访问,从而提升for-in
的性能。 - 而
enum cache
是共享的(在map转换树上的对象共享),当对象的map
方式改变时(比如修改属性的类型),并没有检测原来的map
的描述符数组的enum cache
是否存在,而是直接将enum cache
进行清空,…嗯好像有点不对,脑子有点懵了,明天在好好整理一下
- 其实理解这个漏洞关键要理解 V8 中
明日计划:
- 把强网杯那题搞完
- 学习 Fuzz(今天Fuzz是一点没看,捂脸)
- 看看内核相关的东西(有时间的话)
菜狗就i是我