CC2写链
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语句的内容才会被执行
2, CC2条件控制
- PriorityQueue.java
- size = 2
- comparator != null
- PriorityQueue.add(要序列化的类)
- TemplatesImpl.java
- _name != null
- _class == null
- _bytecodes != null & _bytecodes = 攻击字节码
- _tfactory=new TransformerFactoryImpl()
CC5写链