2020 Netding Cup Xuanwu Group Mobile Security WP

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
Insérez la description de l'image ici

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
Insérez la description de l'image ici

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))

Insérez la description de l'image ici

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

Insérez la description de l'image ici

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

Insérez la description de l'image ici

(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

Insérez la description de l'image ici

(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

Insérez la description de l'image ici

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.

Insérez la description de l'image ici

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:

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43632667/article/details/106389279
conseillé
Classement