逆向 | java | 使用Xbootclasspath参数进行注入

逆向 | java 使用Xbootclasspath参数进行注入

最近在研究burpsuite的破解,就看到了这样一个参数,觉得很有意思,可以用来注入代码。
这个参数的意思也很简单,java运行的时候会提前加载classpath中的类,这样调用到的时候就在这个里面寻找,但是如果使用这个参数,就可以将制定路径或者jar包中的类给提前加载,比如说我要hook一下java.lang.String,正常来说都会直接加载classpath中的这个类,但是如果我自己编写了java.lang.String这样一个类,我就可以让jvm先加载我这个类然后顶替掉系统中的那个。(原理部分是我自己的理解,可能有地方不是很精确)
这个参数在java13以后好像不能用了,本文的测试环境为jdk1.8

直接看代码:
首先要实现一个java.lang.String:
这里我就直接hook了String()这个构造函数,同时实现了main函数测试一下(charAt函数中加入输出会fatalerr,目前不清楚原因):

public String() {
        MzInject.out("inject");
        this.value = "hahahahah".value;
}
public static void main(String[] args) {
        MzInject.out("whoami");
        String tmp = new String();
        MzInject.out(tmp);
}

其余的代码全部复制原来的就行,这样用默认构造函数创建出来的string会有初始值hahahahah。
然后打了一个jar包(直接class文件也行,但是会比较麻烦)
当然idea中是跑不起来的,得命令行启动:
image

完成,这时候就可以去测试将这个jar包中的java.lang.String注入给别的jar包使用。
开一个新项目:

package mz;

public class MzTest {
    public String s;
    public MzTest(){
        this.s = new String();
    }
    public static void main(String[] args) {
        MzTest a = new MzTest();
        System.out.println("test for xbootclasspath: ");
        System.out.println(a.s);
    }
}

同样打包成jar
image

image

然后把之前带有java.lang.String的jar也给复制过来:
image

进行注入:
image

至此,完成对函数的hook。

burpsuite的破解中应该是用到了这样的方法,在反编译keygen的代码中看到了相应的java.lang的classloader类,原理应该同本文所述相似,之后会仔细研究破解的原理。

posted @ 2022-07-05 15:17  Mz1  阅读(624)  评论(1编辑  收藏  举报