文章目录
- 一.程序逻辑分析
- 二.线程2的operate方法解析
- 三.找出真flag
一.程序逻辑分析
onCreate方法中判断SDK版本是否>=27
然后创建两个线程
第一个线程是接受输入的字符串并发送出去
第二个线程用于接受数据
线程1,就是将字符串转为字节数组发送出去
线程2,作为服务端接受数据并进行处理
二.线程2的operate方法解析
这部分主要是用于混淆的代码,很多没有实际作用
有一个方法是根据buffer来截取后一段数据,照着程序逻辑分析可以得出buffer分三段,一段是下标0~3,中间一段是topic(stringData),最后一段是messageData
不过这里都不是很重要可以直接忽略
主要在于check方法,跟进可以发现是aes加密
不过要注意这里的base64换了表,并且填充符不是’=‘而是’^’
解密:
- 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
- aes解密
不过很不幸这里是假的flag
三.找出真flag
可以发现apk文件的assets目录下有一个bin文件,但是不知道具体内容是什么
MainActivity这里也导入了一个库,那么很有可能是这里做了些手脚
stringFromJni是默认的,没有什么特殊操作
JNI_Load里面有不少函数调用,笨方法逐个查看
这个sub_21868就是关键函数了,跟进之后也可以找到打开asset.bin文件的操作(这里如果用字符串查找会更快)
再往下看可以看到"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的标识
将解密后的dex文件用jadx打开,可以发现大部分逻辑还是和之前的结果一样,最主要的差别就是check函数不同,这里是rc4加密和rc4最后调用的base64加密
解密:
- 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解密
输出结果有乱码,将输出结果设置为16进制,然后用16进制转字符串网站即可
根据题目提示最终flag是md5(flag{ikjnmkjh±$})