邪恶小说,JAVA逆向&反混杂-清查Burpsuite的破解原理,满

admin 2019-04-06 阅读:138

0x00 摘要:


本系列文章经过对BurpLoader的几个版其他逆向剖析,剖析Burpsuite的破解原理,剖析Burpsuite认证系统存在的安全漏洞。

0x01 JD-GUI的用途与缺点:


JD-GUI是一款从JAVA字节码中复原JAVA源代码的免费东西,一般情况下运用这款东西做JAVA逆向就足够了,可是因为其原理是从JAVA字节码中依照特定结构来复原对应的JAVA源代码,因而一旦字节码结构被打乱(比如说运用稠浊器),那么JD-GUI就会失掉它的效果,如图为运用JD-GUI翻开Burpsuite时的显现:

显着,JD-GUI没能复原JAVA源代码出来,因为Burps少女白洁uite运用了稠浊器打乱了字节码结构 所以,JD-GUI适用于‘没有运用稠浊器’的JAVA字节码,而缺点是一旦字节码结构被打乱,则无法发挥它的效果

0x02 字节码剖析:


Java的字节码并不像一般的二进制代码在核算机中直接履行,它经过JVM引擎在不同的渠道和核算机中运转。

JVM是一个根据栈结构的虚拟核算机,运用的是JVM操作码(及其助记符),在这一点上和一般二进制反汇编的进程十分类似。 对Java字节码进行反编译其实十分简略,JDK内置的Javap东西即可完结这项使命。 示例:对Javar.class进行反编

留意javap的-c参数是显现详细代码,否则只显现method,而依照java的老规矩Java帮众尚善r不要加后缀名 一起你也能够运用eclipse的插件Bytecode Visualizer来反编凶恶小说,JAVA逆向&反稠浊-清查Burpsuite的破解原理,满译字节码

留意右面的流程图,咱们在上程序设计导论课时都画过吧,现在发现它的用途了吧,一眼就看出是一个if-else结构,前两句界说i变量,然后取i=2压栈常数1,比对i和1今后就都java.lang.system.out了,一个输出wooyun,一个输出lxj616。

0x03 老版其他BurpLoader剖析:


跟着Burpsuite的更新,BurpLoader也在跟着进行更新,咱们从老版其他BurpLoader下手,扼要剖析一下之前老版其他burpsuite破解原理。 本处选用了1.5.01版其他BurpLoader进行剖析 首要试着用JD-GUI载入BurpLoader:

成功复原了BurpLoader源代码,只可惜由所以对burpsuite的patch,所以burpsuite的稠浊在burploade苦战之突击敢死队r里依然可读性极差,不过能够揣度burploader自身没有运用稠浊东西。

public static void main(String[] args)
{
try
{
int ret = JOptionPane.showOptionDialog(null, "This program can not be u红鳝鱼sed for commercial purposes!", "BurpLoader by larry_lau@163.com", 0, 2, null, new String[] { "I Accept", "I Decline" }, null);
//显现选双天至尊第三部择对话框:这程序是出于学习意图写的,作者邮箱larry_lau(at)163.com
if (ret == 0) //挑选我赞同
凶恶小说,JAVA逆向&反稠浊-清查Burpsuite的破解原理,满{
//以下用到的是java反射机制,不明白反射请百度
for (int i = 0; i < clzzData.length; i++)
{
Class clz简略丰胸超前张艳z = Class.forName(clzzData[i]);
//是burpsuit凶恶小说,JAVA逆向&反稠浊-清查Burpsuite的破解原理,满e的静态类(姓名被稠浊过了,也没必要列出了)
Field field = clzz.getDeclaredField(fieldData[i]);
//静态类中的变量也被稠浊过了,也不用列出了
field.付小彦setAccessible(true);
//拜访private必须先设置这个,否则会报错
field.set(null, strData[i]);
//把变量设置成strData(详细那一长串究竟是什么暂不评论)
}
Preferences prefs = Preferences.userNodeForPackage(StartBurp.class);
//显着preferences是用来存储设置信息的
for (int i = 0; i < keys.length; i++)
{
// key和val能猜出是什么吧
曼陀spString v = prefs.get(keys[i], null);
if (!vals[i].equals(v))
{
prefs.put(keys[i], vals[i]);
}
}
StartBurp.main(args)孙耀奇;
}
}
catch (Ex舞犀ception e)
{
JOptionPane.showMessageDialog(null, "This program can only run with burpsuite_pro_凶恶小说,JAVA逆向&反稠浊-清查Burpsuite的破解原理,满v1.5.01.jar", "BurpLoader by larry_lau@163.com",
0);
}
}
}

因而,BurpLoader的原理便是假造有用的Key来经过检测,Key的输入是经过preference来注入的,而我猜想它为了固定Key的核算方法,经过反射把一些环境变量固定成常量了

0x04 新版其他BurpLoader剖析:


以下用1.6beta版的BurpLo疏狂君莫笑ader进行剖析: 首要用JD-GUI测验翻开BurpLoader:

看来这个版其他BurpLoader对字节码运用了稠浊,闺门心计这条路走不通了 所以直接读字节码吧!

咱们能够看到这儿的字符串都是稠浊过的,每一个都jsr到151去解密

这段解密代码特色十分显着,一个switch走5条路,给221传不同的解密key,这不便是Zelix KlassMaster的算法吗? 简金正贤下车单的异或罢了,轻松写出解密机:

public class Verify {
private static String decrypt(String str) {
char key[] = n60milfsew char[] {73,25,85,1,29};
char arr[] = str.toCharArray();
for (int i = 0; i < arr.length; i++) {
arr[i] ^= key[i % 5];
}
ret去势文urn new String(arr);
}
public static void main (Stri倒流香为什么叫死人香ng args[]) {
System.out.println(decrypt("%x'sdgu4t3#x#`egj"hs.7%m|/7;hp+l&/S t7tn5v:j'}_dx%"));
}
}

里边的5个密钥便是上图bipush的传参,别忘了iconst_1的那个1 解密出来是:larry.lau.javax.swing.plaf.nimbus.NimbusLook:4 其实这儿解密出字符丽图串没有什么用途,因为咱们现已拿到老版其他源代码了,不过在其他软件逆向剖析中可能会十分有用

0x05 总结&POC


以下为我修正后的BurpLoader,其间的歹意代码我现已去除,并将修正前的原值输出,咱们能够在增加burpsuite jar包后编译运转这段代码

package stratburp;
import burp.StartBurp;
import java.lang.reflect.Field;
import java.util.prefs.Preferences;
import javax.swing.JOptionPane;
public class startbu凶恶小说,JAVA逆向&反稠浊-清查Burpsuite的破解原理,满rp
{
private static final String[] 比基尼相片clzzData = { "burp.ecc", "burp.voc", "burp.jfc",
"burp.gtc", "burp.zi", "burp.q4c", "burp.pid", "burp凶恶小说,JAVA逆向&反稠浊-清查Burpsuite的破解原理,满.y0b" };
private static final String[] fieldData = { "b", "b", "c", "c", "c", "b", "c", "c" };
private static final String errortip = "This program can only run with burpsuite_pro_v1.5.01.jar";
private static final String[] keys = { "license1", "uG4NTkffOhFN/on7RT1nbw==" };
public static void main(String[] args)
{
try
{
for (int i = 0; i < clzzData.length; i++)
{
Class clzz = Class.forName(clzzData[i]);
Field凶恶小说,JAVA逆向&反稠浊-清查Burpsuite的破解原理,满 field = clzz.getDeclaredField(fieldData[i]);
field.setAccessible(true);
//field.set(null, strData[i]);
System.out.println(field.get(null));
}
Preferences prefs = Preferences.userNodeForPackage(StartBurp.class);
for (int i = 0; i < keys.length; i++)
{
String v = prefs.get(keys[i], null);
System.out.println(prefs.get(keys[i], null));
}
StartBurp.main(args);
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null, "This program can only run with burpsuite_pro_v1.5.01.jar", "Notice",0);
}
}
}

其效果如截图所示

其间前8行输出为之前BurpLoader歹意修正的方针原值(对我的核算机而言),同一台设备运转多少遍都是不变的,后边的key因为我之前运转过BurpLoader因而是歹意修正后的值(可是因为前8行没有修正因而不能经过Burpsuite验证),可见BurpLoader其实是运用了同一个密钥来注册一切不同核算机贝尔吉罗斯的,只不过修正并固定了某些参加密钥核算的环境变量罢了,这大约便是Burpsuite破解的首要思路了,至于开始能用的license是怎样核算出来的,咱们今后再研讨

本文作者:Drops,转载自:http://www.mottoin.com/detail/3651.html