commons-collections 6
为什么我不看CC2,而是选择在看完CC1之后去看CC6,是因为它和CC1的LazyMap有关系,所以我们将CC6拉前头看
这里是因为发现了一个TiedMapEntry的类,发现它的hashcode方法(注意这里和URLDNS链不同的是URLDNS链用的是HashMap里的hashcode方法,而这里是需要通过HashMap中的readObject来调用TiedMapEntry中的hashcode方法,二者本质上不同)
我们先去看TiedMapEntry的构造方法
传完赋值
我们再去看看HashMap的readObject方法中是对key还是value调用hash
这里很显然是对key进行了hash操作,说到这可能有点不明白这个hash和hashcode方法有什么关系,我们再去跟踪一手就能看出来
其实它调用了key的hashcode方法,而这个key显然可控,所以我们需要将东西放到key里而不是value里
成功了,但是还记得URLDNS中的put方法中也有hash么
我们去看看它的hash方法
喵,眼熟了,所以说我们根本没有走我们设想的路,它直接通过hashMap的put方法走了hashcode,所以说即使我们注释掉序列化和反序列化,它也能用,看吧
所以这还叫个钩钩的反序列化,所以我们又要像URLDNS链一样通过反射去改它的值
配上我当时的笔记
但我们这里不是去修改hashcode的值,而是修改我们的factory,但是当我们修改好后发现还是不对,代码如下
然后我们继续去看put中间发生了什么
一路跟到这里来发现
它会去查有没有这个key,如果没有的话会把它放进去,那就我们在结束完put后把它添加的东西删掉
防止它调用的是<lazyMap,f4u1t>这个键值对,我们删掉它后再通过翻身修改发现它成功了