饶派杯XCTF车联网安全挑战赛Reverse GotYourKey

文章目录

  • 一.程序逻辑分析
  • 二.线程2的operate方法解析
  • 三.找出真flag

一.程序逻辑分析

onCreate方法中判断SDK版本是否>=27
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第1张图片
然后创建两个线程
第一个线程是接受输入的字符串并发送出去
第二个线程用于接受数据
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第2张图片
线程1,就是将字符串转为字节数组发送出去
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第3张图片
线程2,作为服务端接受数据并进行处理
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第4张图片

二.线程2的operate方法解析

这部分主要是用于混淆的代码,很多没有实际作用
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第5张图片
有一个方法是根据buffer来截取后一段数据,照着程序逻辑分析可以得出buffer分三段,一段是下标0~3,中间一段是topic(stringData),最后一段是messageData
不过这里都不是很重要可以直接忽略
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第6张图片
主要在于check方法,跟进可以发现是aes加密
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第7张图片
不过要注意这里的base64换了表,并且填充符不是’=‘而是’^’
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第8张图片
解密:

  1. base64解密
import base64
str1 = "UGCA3QBFjPnlAZ6-NbV2Ca=="#将^替换为==即可
string1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-+"#换表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
bytes=base64.b64decode(str1.translate(str.maketrans(string1,string2)))
value=int.from_bytes(bytes,byteorder='big')
print(hex(value))
#得到base64解密后的16进制数据0xe2a9a477496927334b93d83ec41e5c98
  1. aes解密

饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第9张图片
不过很不幸这里是假的flag

三.找出真flag

可以发现apk文件的assets目录下有一个bin文件,但是不知道具体内容是什么
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第10张图片
MainActivity这里也导入了一个库,那么很有可能是这里做了些手脚
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第11张图片

stringFromJni是默认的,没有什么特殊操作
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第12张图片
JNI_Load里面有不少函数调用,笨方法逐个查看
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第13张图片
这个sub_21868就是关键函数了,跟进之后也可以找到打开asset.bin文件的操作(这里如果用字符串查找会更快)
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第14张图片
再往下看可以看到"goodluck"字符串,这可能是加密密钥,跟进之后可以发现是一个rc4加密
到这里可以大概看出是将asset.bin文件打开后进行rc4解密
解密asset.bin文件:

def rc4(data, key):
    S = list(range(256))
    j = 0
    out = []
    # KSA
    for i in range(256):
        j = (j + S[i] + key[i % len(key)]) % 256
        S[i], S[j] = S[j], S[i]
    # PRGA
    i = j = 0
    for char in data:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        out.append(char ^ S[(S[i] + S[j]) % 256])
    return bytes(out)
# Read the encrypted file
with open('asset.bin', 'rb') as f:
    encrypted_data = f.read()
# Decrypt the data
decrypted_data = rc4(encrypted_data, b'goodluck')
# Write the decrypted data to a new file
with open('decrypted_file', 'wb') as f:
    f.write(decrypted_data)

解密后的文件可以看到dex的标识
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第15张图片
将解密后的dex文件用jadx打开,可以发现大部分逻辑还是和之前的结果一样,最主要的差别就是check函数不同,这里是rc4加密和rc4最后调用的base64加密
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第16张图片
解密:

  1. base64解密
import base64
str1 = "SSro3CogRALMhCnQRBDyWa=="

string1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-+"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
bytes=base64.b64decode(str1.translate(str.maketrans(string1,string2)))
value=int.from_bytes(bytes,byteorder='big')
print(hex(value))
#0xdb644e766386d64bf01e6374d659d8e8

2.rc4解密
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第17张图片
输出结果有乱码,将输出结果设置为16进制,然后用16进制转字符串网站即可
饶派杯XCTF车联网安全挑战赛Reverse GotYourKey_第18张图片
根据题目提示最终flag是md5(flag{ikjnmkjh±$})

你可能感兴趣的:(Android,Reverse,安全,Reverse,XCTF,安卓逆向,Android)