攻防世界

攻防世界

Mobile

工具:jadx

基础android

image-20250408174840176

方法一:

下载附件,虚拟机安装一下,发现需要使用密钥

image-20250408203442934

利用jadx打开查看源码,发现里面有个checkPassword函数

image-20250408203642573

双击进入可以看到一段密钥判断的函数

/* 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`

在虚拟机中输入发现还需要一个图片显示码

image-20250408204133217

继续分析原来的源码,可以看到在判断完checkPassword后,进入了“第二个”主函数

image-20250408204808632

在“第二个”主函数里面发现了一个广播。这段代码来自一个 Android 应用的 MainActivity2,主要功能是用户输入一个字符串后,点击按钮发送一个广播。

image-20250408204955302

进一步查看资源文件中的AndroidManifest.xml,我们知道触发该广播需要输入android.is.very.fun,而GetAndChange为广播的接收器。

image-20250408205247467

在虚拟机中继续输入android.is.very.fun就可以进行正常的图片显示了

image-20250408205416781

最终得到flag

方法二:

直接查看资源文件中的assets文件,里面有个zip文件,点卡发现他的文件并不是zip文件,而是jpg文件

image-20250408205709114

直接右键进行导出,将文件后缀zip改为jpg可以得到以下图片

timg_2

最终得到flag{08067-wlecome}

app1

image-20250321141929089

下载题目apk附件,导入jadx中进行分析,先观察源代码中的主函数

image-20250321142147906

发现在主函数里面进行了输入的值是否与“versionCode”和“versionName”进行异或的结果相等判断,如果不相等则输出再接再厉,加油~
因此我们需要对“versionCode”和“versionName”进行分析,得出他们异或的结果,我们可以直接利用工具栏中的搜索进行查找

image-20250321143105552 image-20250321143150086

发现versionCode="15",versionName="X&lt;cP[?PHNB&lt;P?aj"由于该文件为xml类型,可以判断&lt为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

image-20250321134023451

下载附件得到一个apk文件,模拟器安装了一下,发现并没有什么特别的,只是一个很简单的认证界面

image-20250321134134898

接着利用jadx工具对apk文件进行分析

image-20250321134532309

在apk文件的主函数里面发现了一串base64编码,利用Cyberchef进行base64解码发现是乱码

image-20250321134743022

然后回到jadx里面发现该base64字符串利用了一个base64new进行了加密,也就是进行了新的base64字典进行了加密

image-20250321135019364

然后利用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'))

运行一下之后得到

image-20250321135245019

回到模拟器里面打开程序输入字符串05397c42f9b6da593a3644162d36eb01,可以看到验证通过

因此最终的flag为:flag{05397c42f9b6da593a3644162d36eb01}

app2

image-20250321165718444

下载题目apk附件,在模拟器中进行安装发现界面类似一个登录界面

image-20250321182932249

利用jadx进行分析

image-20250321165907260

在主函数中发现关键函数SecondActivity,双击进入函数内

image-20250321170048988

首先它接收了传递过来的用户和密码。调用类Encryto中的doRawData方法,参数为usename+password,如果返回值和VEIzd/V2UPYNdn/bxH3Xig== 相等则进入if中。待会再看if中的代码。我们首先定位到类Encryto

image-20250321170436491

发现可能是利用了JNIEncrypt进行了AES加密

参考:heqinghqocsh/JNIEncrypt: 使用JNI实现Base64编解码,AES加解密(从OpenSSL中抽出),非常适合Android端使用,保持了与调用java输出结果相同,可以直接使用。

Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) - 知乎

然后打开ida进行so源码分析,按下shift+f11键可以直接打开so中所有的字符串内容窗口,然后在其中发现了key:thisisatestkey==

image-20250321181812031

然后利用key对VEIzd/V2UPYNdn/bxH3Xig==进行解密,在线AES解密

image-20250321182751009

所以username+password就是"aimagetencent",然后根据jadx中之前判断的地方,看到if中有个tencent字符串,因此可以判断这个为密码,用户名则为aimage,在模拟器中输入后发现并不对,用户名和密码反过来后程序直接崩了。。。应该是对了,但是没有flag。。。

回到jadx中发现apk源文件的主函数文件附近还有个FileDataActivity文件没被调用过,打开看到里面还有个字符串9YuQ2dk8CSaCe7DTAmaqAA==

image-20250321183908686

再次利用之前的key进行AES解密得到

image-20250321184153465

因此最终的flag为Cas3_0f_A_CAK3

web

upload1

image-20250329171657254

直接利用php一句话

<?php @eval($_POST['123456']);?>

木马上传被拦截了

image-20250329171803277

方法一:

经过尝试,发现它只是在前端进行了对图像文件的判断,打开浏览器的f12功能,选择设置,然后禁用JavaScript

image-20250329172350960

回到网页中重新上传就可以直接上传php文件木马了

image-20250329172620096

方法二:

将木马php后缀改为jpg或png,上传的时候利用bp进行抓包拦截

image-20250329173003976

将刚刚上传的假图片muma.jpg后缀修改为.php,然后放行

image-20250329173223231

回到浏览器可以发现上传成功

|

然后利用蚁剑进行连接http://61.147.171.105:52179/upload/1743240568.muma.php

image-20250329173417249

在上一级目录中发现flag.php文件

image-20250329173609997

打开获得flag

image-20250329173648335

flag=cyberpeace{9d3e99e73ee04b2cd749f64ef6253e6e}

posted @ 2025-03-21 14:44  梦见雨  阅读(102)  评论(0)    收藏  举报