ysoserial源码结构分析
1.前言
之前也花了几天晚上熟悉了一下commonscollections系列的构造,那么学习一下这个项目是如何设计的也挺重要,多学习大佬如何写代码应该也能对自己的代码能力有提升吧~2333
2.项目结构:

首先代码结构如上图所示

exploit文件夹下主要是放一些主要的利用模块,比如如下两个例子

这里用java -cp指定在包ysoserial/exploit的JRMPClinent中寻找主类来执行,那么其中的payload位于payloads文件夹下

比如就如RMIRegistryExploit.java举例:

首先main函数从命令行接收一些初始化参数,比如目标主机的地址和端口以及要执行的命令,接着访问远程注册表服务

初始化结束后,此时要初始化gadget,这里直接通过包名和payload的值确定我们要利用的类完整路径,比如这里payload用commonscollections1为例

这里将通过class.forname加载所需要的payload类,接着判断是否远程是否为ssl链接,如果不是默认非ssl的rmi请求,则upgrade为ssl的rmi请求

接着调用exploit进行payload发送,在exploit函数中这种调用方式还有点意思,封装了一个call方法

这里首先checkingSecurityManager初始化抛出异常

看看callWrapped函数,,这里如何就是个Clallable类的实例,可以看到这里调用call方法

而call是定义callable类时就定义好的,因此这里进入call方法内部,主要就是①根据之前的payload调用其getobject方法,来返回对应gadget的实例

然后②这处用了个releasePayload方法,传入了上文拿到的objectpayload和object,然后感觉这样设计只是为了代码的健壮性,这里最后验证通过class.forname加载的类调用newinstance后是否是releaseableObjectPayload的实例或其父类接口的实例,它父类接口就是ObjectPayload,如果if条件满足则调用releasese方法

暂时没体会到这么体会到这么设计的妙处在哪

payloads文件夹中主要包括注解和一些工具类,包括找class文件,以及生成gadget,判断java版本的,以及paloadrunner里本地测试gadget,以及也直接封装了一些反射的方法 

比如payloadrun就可以直接调试gadget,默认也存储了一些命令

最后几个类封装的序列化和反序列化的类,以及封装的字符串操作的类,以及命令行下根据输入参数生成payload的generatePayload类

以cc1链为例,payloadRunner.run来测试gadget

那么添加自己的链也很容易,只需要实现ObjectPayload接口即可,只需要定义好getObject的返回类型即可

所以整个项目而言,主要包括:
1.exploit类,用于远程attack
2.payload生成类,用于根据gadget生成序列化字节码
3.辅助类,序列化、反序列化、字符串处理、反射等重复性操作封装为辅助类
4.gadget,主要定义为定义好的利用链
这里面也用到了泛型,这块还不太熟悉,下一步学习学习 ==
ysoserial源码结构分析的更多相关文章
- kettle系列-2.kettle源码结构分析
kettle是一个开源产品,产品本身设计是很优秀的,代码应该是很多开源爱好者用业余时间贡献的,代码整体结构还是比较容易理解的,但具体到每一个控件内部就因人而异了,感觉还是挺复杂的,肯定别人考虑得比较全 ...
- Android2.3.7源码结构分析
对Andorid系统进行分析或者系统功能定制的时候,我们经常需要在众多文件中花费大量时间定位所需关注的部分.为了减轻这部分枯燥而不可避免的工作,本文对2.3.7版本的源码结构进行了简单分析.希望对刚加 ...
- android应用程序源码结构分析
工程; 1. src文件夹存放源码. 2. gen下有跟src中一样的包文件,内部有一个名为R.java类,它是自动生成的一个类:该目录不用我们开发人员维护, 但又非常重要的目录 . 该目录用来存放由 ...
- Android 源码结构分析
源码版本:AOSP_7.1.1 硬件平台:Rockchip 由于工作要求,需要对rockchip平台的安卓系统进行剪裁.安卓源码比较庞大,会让人感到无从下手,对此,有必要了解一下源码的大致目录结构以及 ...
- jemalloc源码结构分析(三):arena_malloc_small内存分布
在arena_s结构中,由NBINS数组将bin按照不同规模等级分别存储,每一个等级对应一颗run树,即一颗以chunk_map_t为节点的红黑树,而这些chunk_map_t节点实际分布于各个chu ...
- jemalloc源码结构分析(二):CPU字节对齐算法
在调用arena_malloc_small过程中,要根据申请内存大小,进行对齐计算,然后分配一个整块儿.算法如下: 1)定义一个SIZE_CLASSES宏,它主要用于生成后面两个表,small_siz ...
- jemalloc源码结构分析(一):内存申请处理过程
一.5种malloc方法 1)tcache_alloc_small 2)arena_malloc_small 3)tcache_alloc_large 4)arena_malloc_large 5)h ...
- Kibana6.x.x源码结构分析笔记
- 想要看懂鸿蒙OS源码?朱老师带你从框架分析开始
HarmonyOS V2.0是面向轻量级设备的鸿蒙L0/L1级设备端操作系统,于2020.9开源至今已有2个多月,但是很多同学在学习鸿蒙源码时仍然感觉难以下手,找不到突破口. 2020.11.25(本 ...
随机推荐
- markdown 的一些字体
<font face='Comic Sans MS', size=5> 看看字体 1 one Hello 2 two Hello <font face='Kristen ITC', ...
- VS编译release版本的出现的LNK1104 无法打开文件“libboost_filesystem-vc140-mt-1_58.lib
最近在用restbed和vs2015做一个项目,debug编译的没问题,但是编译release就有问题,困扰了一天,说下我的出坑过程. 1.我用到了外部的库 restbed ,首先要想正确编译过,你的 ...
- [flask]Restful接口测试简单的应用
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : shenqiang from flask import Flask,make_res ...
- kaggle下载不了比赛数据?
先看这个 kaggle数据集下载 -------------------------------- 有时发现下载不了kaggle数据 关于kaggle没有办法下载数据集dataset问题 安装kagg ...
- TPO1-1 Groundwater
If the pores are large,the water in them will exist as drops too heavy for surface tension to hold,a ...
- django+nginx+gunicorn+supervisro部署
一.nginx 1.yum install -y nginx #默认安装后的配置文件路径:/etc/nginx/nginx.conf 2.新建项目的配置文件,因为默认配置文件会包含子配置文件,目录为 ...
- LNOI 2019 旁观记
真.懵逼. 退役选手进队了......我忽然后悔自己没去摸鱼...... 但是想一想毕竟有三分之一限制,我也搞不过那帮大佬...... 毕竟zhx还提前一周复习了一下呢 挂一个zhx大佬的博客 传送门 ...
- Doc: NetBeans
NetBeans的最新版本已经更新为Apache NetBeans. 安装JDK 在Mac OS X下,有".dmg"的安装包,可以直接安装.只要JDK的版本大于1.8.0就可以安 ...
- haproxy笔记之四:配置文件中的关键字参考
3.1 balance balance <algorithm> [ <arguments> ]balance url_param <param> [check_po ...
- keepalive笔记之三:keepalived通知脚本进阶示例
下面的脚本可以接受选项,其中: -s, --service SERVICE,...:指定服务脚本名称,当状态切换时可自动启动.重启或关闭此服务: -a, --address VIP: 指定相关虚拟路由 ...