CC2写链

1, CC2链流程分析

  • 全局搜索PriorityQueue, 点击public class PriorityQueue extends AbstractQueue[PriorityQueue.java]
  • 展开结构视图, 搜索readObject[PriorityQueue.java]
  • 点击heapify[PriorityQueue.java&readObject]
    • 这里出现了size = 2的条件需求
  • 点击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写链