关于CC链1中的一些问题分析

admin 2025年5月23日15:11:45评论0 views字数 2324阅读7分44秒阅读模式

0x00. 前言

CC链1已有很多前辈分析,刚开始还好,到了后面,总觉得学的迷迷糊糊,从各类资料中所学也是一知半解。有很多问题对于Java基础不扎实的我或类似朋友,可能比较吃力。索性,我记录一下除常规链子分析外,一些疑惑的点,以供后续新入学的伙伴参考,因此本篇文章适合于面向刚开始分析CC链1的朋友。如有错误,也烦请大佬指点,不胜感激。

0x01. 完整exp

这里直接贴代码感觉很不美观所以上的图,各位也可以去其它师傅的文章获取exp。关于CC链1中的一些问题分析

0x02. hashmap.put("value",....)

1. 为何要调用hashmap.put()

因为链子在反序列化时,是从AnnotationInvocationHandler的readObject方法入手,目的是想调用readObject方法中的memberValue.setValue()方法。但是,这个方法是在for-each循环中,而我们通过反射得到AnnotationInvocationHandler对象时,要往构造方法中传入map值,而这个map传入进去后,也就对应for循环体内所对应的memberValues,如果memberValues为空,那么for循环就为空,会直接跳出循环体而不执行里面的代码,因此我们为了进入for循环,map中就必须有值,所以我们需要调用hashmap.put()向其中放入数据。关于CC链1中的一些问题分析

2. 为什么hashmap.put()的第一个位置必须为value?

因为我们传入map之后,for循环体内会通过Class<?> memberType = memberTypes.get(name);这条语句来获得name的memberType,我们提到,AnnotationInvocationHandler反射时,第二个参数是map,第一个参数被设定为Target.class注解,这是因为注解Target.class里面包含有value键,所以可以让memberType不为空,进而满足memberType!=null这个条件。当然,只要给的注解里面不为空,你设置其它注解都行,比如Repeatable.class,Retention.class都行。关于CC链1中的一些问题分析所以前面给出的那条语句的memberTypes中就包含了注解里面的内容value关于CC链1中的一些问题分析那么,在执行Class<?> memberType = memberTypes.get(name);的时候,这个name又是由第一句String name = memberValue.getKey();得来,进而可见name就来自于我们所给出的memberValues,通过memberValue.getKey()获得了map的键value。也因此,第二条语句在执行.get(name)的时候,才不会导致memberType为null,从而进入if循环。关于CC链1中的一些问题分析

0x03. AbstractInputCheckedMapDecorator中的setValue()方法

原谅新人菜,分析别的文章的时候实在不能理解为何寻找TransformedMap的checkSetValue方法时,会去到AbstractInputCheckedMapDecorator中的setValue方法。在问AI和分析下继承关系之后,我发现了以下几点:

1. TransformedMap并没有setValue()方法

因为memberValue的类型,是根据memberValues来的,我们传入的对应的memberValues就是TransformedMap,而TransformedMap类中并没有setValue方法,所以这个时候会顺着往TransformedMap的父类去找这个方法。而TransformedMap又继承自AbstractInputCheckedMapDecorator(这里是重点)关于CC链1中的一些问题分析

在AbstractInputCheckedMapDecorator类中,存在以下代码:关于CC链1中的一些问题分析关于CC链1中的一些问题分析关于CC链1中的一些问题分析

这三图的代码,可以理解为重写了for-each函数的逻辑(具体做了什么我们就不深究,只需明白其是改了以下for循环的底层逻辑代码),我通过箭头标出部分可以知道,map通过了MapEntry类来生成,而我们再看向MapEntry类,就会发现该类中存在setValue函数,也就是链子中提到的一环。关于CC链1中的一些问题分析

所以当我们在AnnotationInvocationHandler中进行for循环时,memberValue会因为TransformedMap的父类AbstractInputCheckedMapDecorator中的循环改写,从而去执行了MapEntry里面的setValue。

2. setValue时,parent是如何可控为我们想要的Map类型的?

同样,通过上面分析,我们可以发现TransformedMap是因为找不到setValue,所以会去父类AbstractInputCheckedMapDecorator寻找setValue。所以当进行循环的时候,在entrySet()这个函数内,为我们传递了this值EntrySet构造方法中去,这里的this,就是TransformedMap,而EntrySet构造方法里的parent,就是this所表示的TransformedMap,进而,我们最后setValue的时候,是通过TransformedMap来setValue。关于CC链1中的一些问题分析

debug便可看到parent和this的变化情况。关于CC链1中的一些问题分析关于CC链1中的一些问题分析关于CC链1中的一些问题分析关于CC链1中的一些问题分析

以上便是我在遇到CC链1中的疑惑,道友们如果有疑惑可以留下一同讨论,大佬如果发现错误,还烦请执正,不胜感激。

作者:【le1arn】

原文始发于微信公众号(船山信安):关于CC链1中的一些问题分析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年5月23日15:11:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   关于CC链1中的一些问题分析https://cn-sec.com/archives/4088179.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息