发布于 

攻防世界Mobile- easy-so、基础android

第一题(easy-so)

  1. 下载好题目,连接真机,拖入真机中

  2. 查壳,发现无壳,用jeb反编译后,找到关键字验证失败所在类,发现调用了so层的
    CheckString函数进行了验证,传进去的参数为我们在输入框中输入的字符串,如下图所示


  1. 用IDA打开so文件(要提取x86文件夹下面那个so文件,两个arm文件夹下面的so文件用ida打开
    有问题),找到该静态函数,直接F5大法,静态分析该函数可知:

首先将传入的字符串前16位与后16位互换,然后两两一组互换位置,最后将得到的字符串与字符串f72c5a36569418a20907b55be5bf95ad比较返回比较结果!!


  • 写了一个python小脚本跑出flag,如下所示

string = 'f72c5a36569418a20907b55be5bf95ad'
strlist = list(string)
k = 0


for i in range(16): 

    ch = strlist[1+k]
    strlist[1+k] = strlist[0+k]
    strlist[0+k] = ch
    k = k + 2

k = 0    
for i in range(16):
        ch = strlist[0+k]
        strlist[0+k] = strlist[16+k]
        strlist[16+k] = ch
        k=k+1

print(''.join(strlist))

查看输出结果:

4.最后进行验证:

第二题(基础android)

1、 下载好题目,使用adb install安装到真机,使用scrcpy投屏到虚拟机中

2、 查壳,发现无壳,使用androidKiller反编译后,找到关键函数验证所在的类,发现onClick后对
checkPassword函数进行了调用

3、 判断为12字节长度,我们用GDA打开发现翻译的java代码不准确,使用jadx-gui翻译成java,之后转换为python

def checkPassword(str):
    pass_list = list(str)
    if len(pass_list) != 12:
        return False
    for index in range(len(pass_list)):
        # 将pass_list中每个字符取出,转换为unicode码,然后减去index的值和100的值,最后减去255的值,最后再将unicode码转换为字符放回到pass_list中。
        pass_list[index] = chr(((255 - index) - 100) - ord(pass_list[index]))
        if pass_list[index] != '0' or index >= 12:
            return False
    return True


str = input("Input your password: ")
print(checkPassword(str))

debug模式,查看代码,最后获取password为 -> kjihgfedcba`,成功后跳转

这里发送了一个广播,action就是密码,我们把密码(android.is.very.fun)放进去,最后获取到flag{08067-wlecome}

还有一种思路:

查看java源码,发现time_2.zip,我们解压apk获取到zip包,但发现无法解压,修改后缀后得到flag