0x00 前言
cc6主要还是c部分的利用,就是触发LazyMap的问题。
0x01 HashSet
cc6中最主要的就是将TiedMapEntry的调用。HashMap的put调用hash然后调用hashcode可以触发 TiedMapEntry的hashCode,然后调用HashMap.put从而触发整条链
1.HashMap
首先来看HashMap中的hashcode

hashcode在hash方法中进行了调用
hash在多个方法中进行了调用,这里以put为例

那么我们的问题就是如何去触发这个put。
2.HashSet
在HashSet的readObject中可以看到首先是进行了实例化,然后又调用了put,正好触发到hashmap的put触发。

那么现在就要去构造HashSet的变量值。这里我们用的变量是map,那么我们需要先对map进行一个强制赋值。
poc:
Field f1=HashSet.class.getDeclaredField("map");
f1.setAccessible(true);
HashMap hs= (HashMap) f1.get(hashSet);
实际上可以理解为,满足HashMap的条件。那么这样就可以从HashSet->TiedMapEntry->LazyMap->HashMap的构造
