0.1 CC2 写链
0.1.1 1, CC2 链流程分析
- 全局搜索 PriorityQueue, 点击 public class PriorityQueue extends AbstractQueue[PriorityQueue.java]
- 展开结构视图, 搜索 readObject[PriorityQueue.java]
- 点击 heapify[PriorityQueue.java&readObject]
- 点击 siftDown[PriorityQueue.java&heapify]
- 点击 siftDownUsingComparator[PriorityQueue.java&heapify]
- 这里出现了 comparator != null 的条件
- 我们看到 comparator.compare 属于第一个 if 条件里面的语句, 自动执行, 到此条件已经跟完, 点击 comparator[PriorityQueue.java&siftDownUsingComparator]
- comparator 继承了 Comparator, 点击 Comparator[PriorityQueue.java&Comparator]
- public interface Comparator , 跳转到了接口 [Comparator.java]
- 此时构思 TransformingComparator.java&compare
- 展开接口, 点击 TransformingComparator
- 点开结构视图, 搜索 compare[TransformingComparator.java]
- 看到参数 obj1 和 obj2 是我们利用链必须要传过去的值
- 他们是通过 PriorityQueue.java&add 方法进行传参, 点到 PriorityQueue.java, 展开结构视图搜索 add
- boolean add(E e), 点开 E[PriorityQueue.java&add]
- public class PriorityQueue extends AbstractQueue[PriorityQueue.java]
- PriorityQueue 继承了 AbstractQueue
- 构思 transformer.transform ~> InvokerTransformer.transform
- 全局搜索 InvokerTransformer, 点击 $Id: InvokerTransformer.java [InvokerTransformer.java]
- 展开结构视图搜索 transform[InvokerTransformer.java]
- public InvokerTransformer(final String methodName, final Class<?>[] paramTypes, final Object[] args), 往上看 108 行的构造方法
- iMethodName, 执行的方法
- iParamTypes, 参数类型
- iArgs, 参数值
- 依次对应 Runtime.getRuntime.exec(“calc”)
- Runtime 传不了, 借助于 PriorityQueue
- 思路点 input ~> TemplatesImpl,iMethodName ~> newTransformer
- 全局搜索 TemplatesImpl, 点入 $Id: TemplatesImpl.java[TemplatesImpl.java]
- 展开结构视图, 搜索 newTransformer[TemplatesImpl.java]
- 点入 getTransletInstance[TemplatesImpl.java&newTransformer]
- 两个 if 满足条件, 点击 defineTransletClasses()[TemplatesImpl.java&getTransletInstance]
- _name != null
- _class == null
- 满足条件 _bytecodes != null, [TemplatesImpl.java&defineTransletClasses()]
- return new TransletClassLoader(ObjectFactory.findClassLoader(),tfactory.getExternalExtensionsMap());,
- 在 TemplatesImpl#defineTransletClasses() 中,_tfactory 会被隐式调用
- _tfactory.getExternalExtensionsMap() 是必须调用的方法,如果 _tfactory 为 null,此处会抛出 NullPointerException
- if ~> try 语句, if 语句下的内容满足,try 语句的内容才会被执行
0.1.2 2, CC2 条件控制
- PriorityQueue.java
- size = 2
- comparator != null
- PriorityQueue.add(要序列化的类)
- TemplatesImpl.java
- _name != null
- _class == null
- _bytecodes != null & _bytecodes = 攻击字节码
- _tfactory=new TransformerFactoryImpl()
0.2 CC5 写链