图文精华

分享

2021-07-07 精英班学员作业

wx_小镇青年 发表于 2021-7-14 20:14:11

第一题flag:05397c42f9b6da593a3644162d36eb01

先采用jadx反编译java代码,发现分析点在Base64New类
接着分析,发现采用的正常的Base64的原理,但是Base64ByteToStr的顺序发生了变化,于是自己编写了Base64的decode和encode,Base64ByteToStr传入按照app的顺序改造

第二题flag:flag{MAth_i&_GOOd_DON7_90V_7hInK?}

第二题,分析可知,只需要分析a类中的a方法即可,分析方法中的关键判断发现,只需要解开一元二次方程式即可完成,找到答案,也可以通过暴露运算的方式一个字符一个字符的找,反正也不多就30多个,这里为了复习下初中一元二次方程式的知识,采用了公式D = b2 - 4ac;x(1,2) = (-b ± √D) / 2a,一次成功获得的结果和截图

<
回复

使用道具 举报

挥霍 发表于 2021-7-17 23:12:29
第一题flag:05397c42f9b6da593a3644162d36eb01

第二题flag:flag{MAth_i&_GOOd_DON7_90V_7hInK?}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

心情落叶 发表于 2021-7-18 01:20:53

本帖最后由 心情落叶 于 2021-7-18 01:22 编辑

第一题flag:05397c42f9b6da593a3644162d36eb01

image.png 第二题flag:flag{MAth_i&_GOOd_DON7_90V_7hInK?}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

萝卜 发表于 2021-7-18 11:03:55
第一题flag:05397c42f9b6da593a3644162d36eb01
第二题flag:flag{MAth_i&_GOOd_DON7_90V_7hInK?}



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

晨辉 发表于 2021-7-18 12:47:04
详见附件,说明文档

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

Heaven.路 发表于 2021-7-28 09:41:43
第一题flag:05397c42f9b6da593a3644162d36eb01
第二题flag:flag{MAth_i&_GOOd_DON7_90V_7hInK?}

点评

速度挺快的  发表于 2021-7-28 10:25
<
回复

使用道具 举报

mlq 发表于 2021-7-28 19:55:21
package com.java.demo;
//jadx拿到源码 开始暴力破解
import java.nio.charset.StandardCharsets;

public class HelloWord {
    private static final char[] Base64ByteToStr = {'v', 'w', 'x', 'r', 's', 't', 'u', 'o', 'p', 'q', '3', '4', '5', '6', '7', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'y', 'z', '0', '1', '2', 'P', 'Q', 'R', 'S', 'T', 'K', 'L', 'M', 'N', 'O', 'Z', 'a', 'b', 'c', 'd', 'U', 'V', 'W', 'X', 'Y', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', '8', '9', '+', '/'};
    private static final int RANGE = 255;
    private static byte[] StrToBase64Byte = new byte[128];
    private static  StringBuilder res1 = new StringBuilder();

    private static byte[] miyao = new byte[32];
    private static byte[]  strKey={12,3,20,51,14,19,29,35,13,3,9,38,14,22,8,54,25,6,4,53,14,19,13,33,12,51,24,52,13,3,4,54,12,38,16,51,13,38,21,34,12,3,4,64};
    public static void main(String[] args)
    {
        System.out.println("helloword");
       jisuankey((byte)0,-1,0);
       a(0);
       System.out.println(res1.toString());
        System.out.println(res2.toString());
    }
    private static int[] a = {0, 146527998, 205327308, 94243885, 138810487, 408218567, 77866117, 71548549, 563255818, 559010506, 449018203, 576200653, 307283021, 467607947, 314806739, 341420795, 341420795, 469998524, 417733494, 342206934, 392460324, 382290309, 185532945, 364788505, 210058699, 198137551, 360748557, 440064477, 319861317, 676258995, 389214123, 829768461, 534844356, 427514172, 864054312};
    private static int[] b = {13710, 46393, 49151, 36900, 59564, 35883, 3517, 52957, 1509, 61207, 63274, 27694, 20932, 37997, 22069, 8438, 33995, 53298, 16908, 30902, 64602, 64028, 29629, 26537, 12026, 31610, 48639, 19968, 45654, 51972, 64956, 45293, 64752, 37108};
    private static int[] c = {38129, 57355, 22538, 47767, 8940, 4975, 27050, 56102, 21796, 41174, 63445, 53454, 28762, 59215, 16407, 64340, 37644, 59896, 41276, 25896, 27501, 38944, 37039, 38213, 61842, 43497, 9221, 9879, 14436, 60468, 19926, 47198, 8406, 64666};
    private static int[] d = {0, -341994984, -370404060, -257581614, -494024809, -135267265, 54930974, -155841406, 540422378, -107286502, -128056922, 265261633, 275964257, 119059597, 202392013, 283676377, 126284124, -68971076, 261217574, 197555158, -12893337, -10293675, 93868075, 121661845, 167461231, 123220255, 221507, 258914772, 180963987, 107841171, 41609001, 276531381, 169983906, 276158562};

    /* JADX DEBUG: Multi-variable search result rejected for r5v0, resolved type: byte[] */
    /* JADX DEBUG: Multi-variable search result rejected for r7v3, resolved type: byte */
    /* JADX WARN: Multi-variable type inference failed */
    private static  StringBuilder res2= new StringBuilder();
    private static  int[] iArr = new int[a.length];
    public static boolean a(int i2) {
        if (i2 == b.length) {
            return true;
        }

        iArr[0] = 0;
       for(int j=0;j<256;j++)
       {
           iArr[i2+1]=j;
           if ((a[i2] == (b[i2] * iArr[i2] * iArr[i2]) + (c[i2] * iArr[i2]) + d[i2] && a[i2 + 1] == (b[i2] * iArr[i2 + 1] * iArr[i2 + 1]) + (c[i2] * iArr[i2 + 1]) + d[i2]))
           {
               if(a(i2+1))
               {
                   res2.insert(0,(char)j);
                   return true;
               }
           }

       }

        return true;
    }

    public static String Base64Encode(byte[] bytes) {
        StringBuilder res = new StringBuilder();
        for (int i = 0; i <= bytes.length - 1; i += 3) {
            byte[] enBytes = new byte[4];
            byte tmp = 0;
            for (int k = 0; k <= 2; k++) {
                if (i + k <= bytes.length - 1) {
                    enBytes[k] = (byte) (((bytes[i + k] & 255) >>> ((k * 2) + 2)) | tmp);
                    tmp = (byte) ((((bytes[i + k] & 255) << (((2 - k) * 2) + 2)) & 255) >>> 2);
                } else {
                    enBytes[k] = tmp;
                    tmp = 64;
                }
            }
            enBytes[3] = tmp;
            for (int k2 = 0; k2 <= 3; k2++) {
                if (enBytes[k2] <= 63) {
                    res.append(Base64ByteToStr[enBytes[k2]]);
                } else {
                    res.append('=');
                }
            }
        }
        return res.toString();
    }

    public  static  boolean jisuankey(byte tmp1,int k,int j)
    {
        int length=strKey.length-1;

        byte tmp =tmp1;
        k++;
        if((j*4+k)==42)
        {
                if(strKey[j*4+k] == tmp1)
                {
                        return true;
                }
            return false;
        }
        int i=0;
        if(k>3) {
            k=-1;
            j++;
            if(jisuankey((byte)0,k,j))
            return true;
            else
               return  false;
        }
       if(k==3)
       {
               if(strKey[j*4+k] == tmp)
               {


                   if(jisuankey(tmp,k,j))
                   {
                     // System.out.println(i);
                       return true;
                   }
                   return false;

               }else
                   return  false;
       }
        if(i==256) return false;
        for(i=0;i<256;i++)
          {
              byte xx= ((byte) (((i& 255) >>> ((k * 2) + 2)) | tmp1));
              if(strKey[j*4+k] == xx)
              {
                  tmp = (byte) ((((i & 255) << (((2 - k) * 2) + 2)) & 255) >>> 2);


                 if(jisuankey(tmp,k,j))
                 {

                        // System.out.println(i);
                     res1.insert(0,(char)i);

                     return true;
                 }
              }
          }
        if(i==256) return false;
        return false;
    }
}



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

古哥 发表于 2021-8-1 21:00:03
第一题flag:05397c42f9b6da593a3644162d36eb01
第二题flag:flag{MAth_i&_GOOd_DON7_90V_7hInK?}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
<
回复

使用道具 举报

wx_188 发表于 2021-8-2 15:24:21
第一题正确的flag:05397c42f9b6da593a3644162d36eb01
第二题正确的flag:flag{MAth_i&_GOOd_DON7_90V_7hInK?}
图我就不上了
<
回复

使用道具 举报

123
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则