buuctf
helloworld
下载后是apk文件
使用dex2jar转为jar包,在使用jd-gui反编译jar包
flag{7631a988259a00816deda84afb29430a}
java逆向解密
下载后是.class文件,jd-gui打开该文件后。
解密原理:arr[i] + 64 ^ 0x20 =key[i]
KEY = [180, 136, 137, 147, 191, 137, 147, 191, 148, 136,
133, 191, 134, 140, 129, 135, 191, 65]
for i in KEY:
a = i-64^0x20
print(chr(a),end='')
flag{This_is_the_flag_!}
findit
下载文件是apk.zip,解压出apk文件。
方法一:jadx
代码逻辑:对输入的值进行判断,在对已有的数组进行处理后输出
old_flag = ['p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}']
tmp = ""
for i in old_flag:
if (i >='A' and i<='Z') or (i>='a' and i<='z'):
b= chr(ord(i)+16)
if (b >'Z' and b <'a') or ( b>='z'):
tmp+= chr(ord(b)-26)
else:
tmp += chr(ord(i) + 16)
else:
tmp+= i
print(tmp)
或者运行apk,输入答案LzakAkLzwXdsyZgew(对数组a写脚本处理的结果)
Bugku
signin
下载是个apk文件。运行如下图
jeb反编译apk,程序逻辑是对字符串反转在base64解码,最后flag为:flag{Her3_i5_y0ur_f1ag_39fbc_}
使用其他工具无法直接看到字符串内容,流程如下
AndroidManifest.xml的确定re.sdnisc2018.sdnisc_apk1.MainActivity这个类。反汇编出smali文件的,解析此。可以看错getFlag和checkPassword函数。getFlag确定资源id:0x7f0b0020.资源id由R#string.smali获取,确定资源名toString。在资源文件strings.xml找到资源名toString
mobile1
下载的是apk文件,模拟器中运行apk
jeb查看apk,代码逻辑:输入的字符串与username(md5后转16进制后在取下标偶数位)相同
B9C77224FF234F27AC6BADF83B855C76->bc72f242a6af3857->flag{bc72f242a6af3857}
First_Mobile
下载是apk文件,jeb打开,关键在check中
输入的字符串经过两次for循环处理后仍与原始字符串相同。
b = [23, 22, 26, 26, 25, 25, 25, 26, 27, 28, 30, 30, 29, 30, 0x20, 0x20]
arg7 = "ABCDEFGHJIKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890{}_"
str_end =""
for i in range(len(b)):
for j in range(len(arg7)):
tmp_b = str.encode(arg7[j])
tmp = (ord(tmp_b) + b[i]) % 61
temp = tmp*2 - i
# print(chr(temp))
if temp == ord(tmp_b):
str_end +=tmp_b.decode()
print(str_end)
#LOHILMNMLKHILKHI
看别人的wp还有另一种方法:str[i] = 122+i-2*b[i]
((a1[i]+b[i])%61)*2 - i = a1[i]
((a1[i]+b[i])%61)*2 = a1[i] + i
(a1[i]%61 + b[i] ) *2 = a1[i] + i
a1[i]%61 属于0-61
a1[i] 属于 61-122
则 a1[i]%61 = a[i]-61
2* a1[i] -122 +2*b[i] = a1[i] +i
timer
下载是个apk文件。
1.从is2函数获取k,
2.修改smali文件->修改if条件为>0;用获取到的k传入stringFromJNI2函数中。
public class text{
public static boolean is2(int n) {
if(n <= 3) {
return n > 1;
}
if(n % 2 == 0 || n % 3 == 0) {
return false;
}
for(int i = 5; i * i <= n; i += 6) {
if(n % i == 0 || n % (i + 2) == 0) {
return false;
}
}
return true;
}
public static void main(String args[]){
int time=200000;
int k=0;
while(time>0){
if(is2(time)){
k+=100;
}
else{
k--;
}
time--;
}
System.out.println(k);
//1616384
}
}
使用ak修改下图中的两处,
AK打开此apk,搜索stringFromJNI2,选择MainActivity$1.smali
为什么是MainActivity$1.smali而不是MainActivity.smali呢?
因为主要的判断逻辑是在OnClickListener这个类里,而这个类是MainActivity的一个内部类,同时我们在实现的时候也没有给这个类声明具体的名字,所以这个类用$1表示。
重新编译打包签名运行后flag已经显示出来了。
flag{Y0vAr3TimerMa3te7}
safebox
下载后是apk文件,运行效果
有两个activity
只有for循环中有差异。
将两个算法都实现以下,看看结果符合题目描述的就是正确答案
描 述: flag格式NJCTF{xxx} 并且 xxx只包含[a-z][A-Z][0-9]
NJCTF{have05if4n}