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
法三:
連點器?