ps: Le titre m'a été envoyé par quelqu'un d'autre, et je ne suis pas qualifié pour participer à ce concours
vulcrack
Ouvrez d'abord jadx et trouvez que c'est un programme shell
Il est facile de voir que libjiabu.so et le nom du paquet sont un shell 360. Ici, nous utilisons frida-dexDump, qui est populaire dans les principaux forums, pour décompresser .
Raison pour laquelle ce sujet est très malade, j'ai ouvert avec l'émulateur Android ne peut pas exécuter le temps, le sentiment peut être de détecter le shell du simulateur de présence 360, donc ne peut pas seulement utiliser les instructions réelles de la machine, puis ma vraie machine d'oie plus épicée Poulet, à partir de frida souvent signalé des erreurs, et même considéré comme un bombardement manuel, et a finalement terminé le bombardement après une longue période de lancer.
Processus de bombardement
Démarrez frida_server:
cd /data/local/tmp
./frida_server
Redirection de port:
adb forward tcp:27042 tcp:27042
Ensuite, exécutez apk, exécutez main.py
python main.py
Analyse dex
Après avoir obtenu le dex, vérifiez et trouvez l'adresse de cryptage principale
La logique après le déballage est très simple
(1) Décodage Base64 de keyFirst et keySecond,
(2) Passé dans la méthode comm pour certains traitements
Décryptage du script Python:
import base64
keyFirst = "Zm1jan85NztBN0c0NjJIOzJGLzc8STk0OTZFSDE="
keySecond = "QTpISTlFNEkxRTY8fQ=="
flag = []
First=base64.b64decode(keyFirst)
Second=base64.b64decode(keySecond)
for i in range(len(First)):
flag.append(First[i] - (i % 8))
for i in range(len(Second)):
flag.append(Second[i] - (i % 4))
print(bytes(flag))
Le drapeau déchiffré est:
flag {414A6E12-B42E-48D3-95CE-A9FF9D2F1D49}
Pour résumer
La principale difficulté de cette question est le déballage. L'utilisation d'outils de déballage simplifie grandement cette étape. Dans le futur, nous étudierons certains processus de déballage et rédigerons un plan de déballage manuel.
Java
Commencez par ouvrir l'analyse jadx, comme son nom l'indique, tout le code est dans la couche java
une analyse
La logique de chiffrement principale est stockée dans la méthode a:
(1) Initialisez d'abord le tableau bArr
(2) Effectuer une opération de cryptage AES sur les chaînes a et b
(3) Appelez la méthode a, d'abord XOR la chaîne cryptée par aes avec le XOR bit à bit 22, puis effectuez l'opération XOR bit à bit avec le tableau c dans la classe c
(4) Effectuez un encodage base64 sur la chaîne de caractères après XOR et comparez-le avec la chaîne de caractères b
Il y a un petit trou ici, c'est-à-dire qu'il y a une place dans le code du programme qui remplace un caractère dans la chaîne ca
J'ai toujours signalé une erreur lorsque j'ai écrit le script au début
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 3: invalid continuation byte
, et j'ai finalement trouvé cet endroit de remplacement grâce au débogage dynamique pour vérifier la logique spécifique.
script python
import base64
from Crypto.Cipher import AES
b = "VsBDJCvuhD65/+sL+Hlf587nWuIa2MPcqZaq7GMVWI0Vx8l9R42PXWbhCRftoFB3"
c = [214, 144, 233, 254, 204, 225, 61, 183, 22, 182, 43, 103, 20, 194, 40, 251, 44, 5, 43, 103, 154, 118, 42, 190, 4,195, 43, 103, 170, 68, 19, 38, 73, 134, 43, 103, 153, 156, 66, 80, 244, 145, 80, 103, 239, 152, 122, 98, 50, 214]
x = base64.b64decode(b)
y = []
for i in range(len(x)):
y.append(x[i] ^ 22 ^ c[i])
y = bytes(y)
aeskey = "aes_check_key!@#".replace('e','o').encode("utf-8")
cipher = AES.new(aeskey, AES.MODE_ECB)
z = cipher.decrypt(y)
flag=str(z,encoding="utf-8")
print(flag)
Le résultat de sortie est:
indicateur {67587AAF-C20A-4B6D-991B-A40FD3C2098E} , le résultat du test a réussi.
Pour résumer
Cette question est relativement simple. Je n'ai reçu cette question que plus tard. Cette question est toute logique java. Le seul écueil est le remplacement. Je l'ai résolu avec l'aide du débogage dynamique.
Bienvenue à suivre le compte officiel pour plus d'informations: