BMZCTF(12.26)
抽空做了一下,总体来说简单。总共三道题。全做了
RE
1.逆向_RE1
主函数如图。
加密流程
输入字符串-->异或-->取余-->异或
注意那个加密函数分析后发现是没有起到作用的
直接爆破
脚本
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
主函数
先读取字符串,传进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的逆向题。
查壳
jadx分析
分析代码可知,有签名验证,然后判断点击次数,达标就跳转到另一Activity直接显示flag。
(BUUOJ也有一道类似的题,那道题是直接改smali即可,这道题,因为加了签名验证,直接改,前面签名验证失败而打开不了)
法一:直接逆算法
加密算法如下:
简单粗暴,直接扣出来直接逆(懒)
脚本
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]);
}
}
}
//flag{Every0ne-0f-BMZCTF-1s-3he-Best}
法二:patch
方法:使用AndroidKiller直接在AndroidManifest.xml配置文件修改默认启动项。(不启动那个页面即不会进行签名验证,从而达到我们的目的。)
修改前
修改后
直接给flag
法三:
连点器?