java-cc4、cc2、cc5、cc7
##cc4
###为什么需要cc4
cc4使用的版本是
在这个版本中有个类发生了变化,所以可以进行反序列化
##cc4构造
cc4中,这个类实现了serialize接口,并且在
其compare函数中实现了transform方法,因此,我们只需要找到能到达这个compare方法的链子即可
在PriorityQueue这个类的readObject中存在
进入heapify函数中可以发现,前提是size序列要大于等于2,才能进入到for循环中
接下来再继续,就调用到了这个compare
前面的部分和之前的一样,区别就是后面的封装
TransformingComparator transformingComparator = new TransformingComparator<>(new ConstantTransformer<>(1)); |
##CC2
和CC4的区别:
使用的是invoketransformer,而template(任意代码执行内容)是在后面传入的
InvokerTransformer<Object,Object> invokerTransformer = new InvokerTransformer<>("newTransformer",new Class[]{},new Object[]{}); |
但是这里就抛出了一个问题,为什么第一次add的时候才能实现命令执行,因为在反序列化的过程中invoketransformer是一个消耗品,此时已经在add的元素为1的时候被消耗掉了,所以就轮不到template了,和之前的cc6是一个问题。
而cc2和其他的链子最大一个区别是这里没有用到数组的处理方式(也就是chainedtransformer),因此在有些数组加载不到的情况下可以使用cc2
##cc5
cc5和其他区别主要是在Lazymap的get方法的调用链中,使用的是其他类来触发get方法,:BadAttributeValueExpException.readObject->TiedMapEntry.toString
所以如果遇到toString方法的时候可以用cc5来进行构造
##cc7
Hashtable.readObject -> AbstractMap.equals->xx.get
这里比较特别的是这个equals是有点继承的意味在里面,向上继承才用到的
java-cc4、cc2、cc5、cc7