西电高中比赛

最近看编译原理看的头大,来打下西电高中生的比赛放松下,我无名巨依旧屠场(xmsl),一共做了三个题,一个mobile,两个re
先看安卓,拿到apk直接丢到解压拿dex丢到jeb里看下逻辑

123

可以看到获取用户的输入之后调用encrpty方法进行加密,去里面看看,发现时rsa,并且给了公钥,但是似乎。。没法成功解密。回头看下apk结构,发现assets下面有个key.txt,似乎是加密后的密钥,搜索下哪里调用了key.txt这个文件,找到了解密处

123

可以看到这里是对文件进行了解密,直接在返回值处打log就行了,把decode这个类的代码复制下,然后打个log完事(不得不夸下jeb,复制代码都没error的)

123

可以在日志里看到解密后的私钥,直接拿到网站或者用工具解密就行了

123

再看下EasyCrack,无壳无反调,直接 放入ida分析

123

可以获取输入后,比较了长度和23,并且穿了一个函数分析,一眼就可以看出来是base64(其实在string窗口也可以看出来)

123

123

123

base64之后输入从23位变成了32位,并且传入一个简单的加密,最后和一个数组比较,写脚本解密,发现一直有一部分是负数,核查了好几遍数据之后,想了下,负数在内存中存在的方式以及char类型,只要对负数加个256就可以了,下面给出脚本

static void Main(string[] args)
    {
        int[] v4 = new int[32] { 109, 108, 58, 122, 29, 79, -118, 127, -72, 74, 87, 19, 47, -89, 99, -70, -59, -86,101, -103, -33, 88, -11, 84, 70, -85, -78, -96, 49, -64, -21, 56 };
        int[] v36 = new int[32] { 87, 77, 78, 94, 75, 90, 81, 85, 93, 94, 95, 81, 92, 77, 88, 95, 87, 84, 93, 88, 89, 89, 88, 95, 91, 88, 95, 91, 93, 76, 82, 95, };//v36
        int[] c = new int[32] { -32, 78, -12, 112, -4, -42, -83, 124, -123, 123, -48, -54, -15, -30, -5, -23, 70, -17, -38, 71, 46, -62, 69, -125, -63, 68, 127, 35, -10, -6, -119, 100, }; //v1
        int[] v68 = new int[32];//v68
        int[] e = new int[32];
        for (int i = 0; i < 32; ++i)
        {
            //Console.Write(c[i]+" ");
            if (i % 2 == 0)
                v68[i] = c[i] + v36[i];
            else
                v68[i] = c[i] - v36[i];
            // Console.Write(d[i]+" ");
            e[i] = v68[i] ^ v4[i];

        }
        for (int i = 0; i < 32; ++i)
        {
            if (e[i] < 0)
                e[i] += 256;
            Console.Write(Convert.ToChar( e[i]));
            //else
            //Console.Write(" ");
        }

        Console.Read();
    }

在这个+256这块卡了好久,还是太菜了,运行结果是base64过的,随便找个地方解密下就行了

123

再看第三个re(第二个卡着了,下篇博客补上),同样无壳无反调,直接拖入ida分析。可以看到判断输入之后传入了decode函数分析,由于hint是维吉尼亚,可以猜到这个就是维吉尼亚加密了,

123

可以看到在经过一次decode之后,结果和e什么的形似flag的东西比较如果一样就输出flag,但是这里可以直接通过第二个decode函数找到flag,本想在调试器里改eip强跳的,后来还是在vs里跑了下,贴下代码

static void Main(string[] args)
    {
        //NIJP6cvv  ePLP6XlM
        string a = "blqyhakjdefbnzxcnnmkadwqioeuoqabmnzcqeq";
        string b = "eaki{Wuczkhd_ur_Zvqaev_Wggok_Mltpupsca}";
        int len1 = a.Length;
        int v5,v4;
        int len2 = b.Length;
        char[] d = new char[39];
        for (int i = 0; i < len2;++i)
        {
            if (b[i] < 97 || b[i] > 122)
            {
                if (b[i] < 65 || b[i] > 90)
                {
                    if (b[i] != 95 && b[i] != 123 && b[i] != 125)
                        Console.Write("nmsl");
                    else
                        d[i] = b[i];
                }
                else
                {
                    v5 = b[i] + a[i % len1] - 97;
                    if (v5 > 90)
                        v5 = b[i] + a[i % len1] - 123;
                    d[i] = Convert.ToChar(v5);
                }
            }
            else
            {
                v4 = b[i] + a[i % len1] - 97;
                if (v4 > 122)
                    v4 = b[i] + a[i % len1] - 123;
                d[i] = Convert.ToChar(v4);
             }
        }
        for (int i = 0; i < 39; i++)
            Console.Write(d[i]);
        Console.Read();
    }

直接给出脚本就行了,可以立刻获得flag

123

第二题有了hint明天继续分析,今天就这样吧