BMZCTF -- WP(12.26)

BMZCTF(12.26)

抽空做了一下,总体来说简单。总共三道题。全做了

RE

1.逆向_RE1

image-20201231204156313

主函数如图。

加密流程

输入字符串-->异或-->取余-->异或

注意那个加密函数分析后发现是没有起到作用的

直接爆破

脚本

   str=[0x4D5E21, 0x4D5E2B, 0x4D5E3E, 0x4D5E20, 0x4D5E54,
    0x4D5E1D,0x4D5E0A, 0x4D5E35, 0x4D5E1C, 0x4D5E33, 0x4D5E01, 0x4D5E38,
   0x4D5E0D, 0x4D5E22, 0x4D5E32, 0x4D5E22, 0x4D5E37, 0x4D5E2C,
  0x4D5E6C, 0x4D5E38, 0x4D5E6E, 0x4D5E2C, 0x4D5E38, 0x4D5E1C,
     0x4D5E28, 0x4D5E6F, 0x4D5E6E, 0x4D5E5A]
        flag=''
        for i in range(0, 28):
            for f in range(0,127):
              enc=f
              enc^=0x1A2B3C
              enc%=1714956
              enc^=0x4D5E6F
              if(enc==str[i]):
                  flag+=chr(f)
        print(flag)
#flag{BMZCTF_ReUeXs3_1s_Co01}

2.逆向_RE2

主函数

image-20201231210412007

先读取字符串,传进Auth函数,看返回值是否为1.若是则为flag

Auth函数

加密流程

切割字符串为三段-->每部分异或一个值-->每部分都传进SboxExchangeX(X=A,B,C)进行类似表替换-->进行结果判断

脚本

s1=[ 7,  5,  2, 4,
         3, 1,  6, 0,
         8]
s2=[2,     6,      0,    7,  4,
    5, 1,   3,   8]
s3=[ 3, 1,    6,
         0,   8,    5,
         2, 7,    4,  ]
sss1=[0x0C8E, 0x0C85, 0x0C87, 0x0C99, 0x0CA4, 0x0CD1, 0x0C83, 0x0C8E,0x0C84]
sss2=[0x0F9A, 0x0F8B, 0x0FA0, 0x0FCF, 0x0F8D, 0x0FA0, 0x0FB9, 0x0F9E,0x0FA0]
sss3=[0x48F, 0x499, 0x48F, 0x497, 0x4DD, 0x4B5, 0x49C, 0x482, 0x4B8]
ss1=[0]*9
ss2=[0]*9
ss3=[0]*9
flag1=''
flag2=''
flag3=''
for i in range(0,9):
    ss1[s1[i]]=sss1[i]^0xCE2
    ss2[s2[i]]=sss2[i]^0xFFF
    ss3[s3[i]]=sss3[i]^0x4EA
for i in range(0,9):
    flag1+=chr(ss1[i])
for i in range(0,9):
    flag2+=chr(ss2[i])
for i in range(0,9):
    flag3+=chr(ss3[i])
print(flag1[::-1]+flag2+flag3[::-1])
#flag{Fe3l_Fear_t0_7he_Revs}

3.逆向_RE2

是一道mobile的逆向题。

image-20201231213421798

查壳

image-20201231211049857

jadx分析

image-20201231211237017

image-20201231211351163

分析代码可知,有签名验证,然后判断点击次数,达标就跳转到另一Activity直接显示flag。

(BUUOJ也有一道类似的题,那道题是直接改smali即可,这道题,因为加了签名验证,直接改,前面签名验证失败而打开不了)

法一:直接逆算法

加密算法如下:

image-20201231211914231

简单粗暴,直接扣出来直接逆(懒)

脚本

package com.re;

public class EasyJava {

    /* access modifiers changed from: protected */

    int[] wocaozheshisha(int[] unenc) {
        for (int b = 0; b <= 34; b++) {
            unenc[b + 1] = unenc[b] ^ unenc[b + 1];
        }
        return unenc;
    }
    public static void main (String[] args) {
        int[] encF = {4, 5, 30, 27, 9, 55, 56, 53, 43, 15, 70, 90, 85, 14, 25, 9, 78, 54, 83, 96, 25, 23, 19, 115, 25, 49, 77, 75, 29, 28, 4, 122, 96, 110, 56, 16};

        re3 re3 = new re3();
        re3.wocaozheshisha(re3.wocaozheshisha(re3.wocaozheshisha(encF)));
        byte[] e = "bmz".getBytes();
        int i = 0;
        while (true) {
            int[] iArr = encF;
            if (i > iArr.length - 1) {
                break;
            }
            iArr[i] = e[i % 3] ^ iArr[i];
            i++;
        }
        StringBuilder flag = new StringBuilder();

        for(int i2 = 0; i2 <= encF.length - 1; i2++) {
            flag.append((char) encF[i2]);
        }

    }
}

image-20201231212117790

//flag{Every0ne-0f-BMZCTF-1s-3he-Best}

法二:patch

方法:使用AndroidKiller直接在AndroidManifest.xml配置文件修改默认启动项。(不启动那个页面即不会进行签名验证,从而达到我们的目的。)

修改前

image-20201231213141981

修改后

image-20201231213103933

直接给flag

image-20201231213341158

法三:
连点器?

原文地址:https://www.cnblogs.com/pupububu/p/14218706.html