Hackvent 2017 Solutions bitcoin in uae

Cela m’a fait réfléchir un peu. Après avoir réfléchi à cela, j’ai cliqué sur décoder une seconde fois. Heureusement, ce site utilisé avait des boutons de décodage de gauche à droite et de droite à gauche. Il me suffisait donc de cliquer sur le boutons de décodage en alternance, mais j’ai toujours eu des résultats en base64. Maintenant, j’ai compris le sens de l’indice cinquième puissance de deux (qui signifie 32). Donc je devais clic décoder 32 fois. Très facile avec ce site. Et finalement le drapeau est apparu.

En téléchargeant le fichier, il affiche un fichier de log énorme, avec rien d’intéressant. J’ai trouvé qu’il y avait un crash mais rien d’autre d’intéressant. Quand je me suis retrouvé coincé, j’ai compris que je devais regarder de plus près le crash. bitcoin source Cela m’a aidé à trouver la ligne suivante:


Comme vous pouvez le voir sur cette page, il y a quelques explications intéressantes sur son fonctionnement, qui expliquent même comment décoder les bits manuellement. Malheureusement, le message décodé n’avait aucun sens. Était-ce la raison pour laquelle il s’est écrasé? Je pensais chercher un autre site capable de décoder et trouver le site https://www.diafaan.com/sms-tutorials/gsm-modem-tutorial/online-sms-pdu-decoder/

Ce bouton télécharge un fichier PDF dans lequel rien d’utile n’est visible (il suffit d’une image du père Noël avec du texte de l’avent et des liens vers Wikipedia). J’ai essayé divers outils, tels que pdf-parser, peepdf, qpdf et mupdf, pour en examiner le contenu. Je pense que l’outil peepdf est le meilleur pour ce défi, mais malheureusement, avec aucun des outils, je n’ai rien trouvé d’intéressant. J’ai essayé de résoudre ce problème plusieurs heures par jour pendant plus d’une semaine, mais je ne pouvais aller nulle part. Enfin, quelqu’un m’a fait comprendre que je devrais regarder de plus près la police et que cela m’aidait. C’est peut-être un format de police connu de Linux ou autre chose, mais comme je n’ai jamais vu de fichier SFD, c’est pourquoi je n’ai fait aucun progrès depuis si longtemps.

Mais comme je savais déjà maintenant regarder de plus près dans cette police, j’ai cherché un outil pour éditer de tels fichiers et trouvé FontForge. Le programme d’installation de Windows mesure 18 Mo et l’exécution de l’outil ouvre une interface semblable à celle d’OS X. En ouvrant la police, vous obtenez une liste de caractères définis:

J’ai donc écrit un programme quickdirty C # .NET à partir de ce code (je ne le trouve plus pour le moment) simplement pour forcer brutalement toute la plage de 0 … 0xffffffff et si l’un des résultats est l’un des chiffres de la tâche, puis affiche la valeur (numéro de source et résultat). Les valeurs source trouvées sont en réalité les codes ASCII du drapeau.

Pour cet article, j’ai recherché des outils en ligne permettant d’effectuer une recherche inversée de CRC-32 et j’ai trouvé un site qui fait exactement cela. Malheureusement, cela ne fonctionne pas sur toutes les valeurs et ne peut donc pas vraiment être utilisé pour résoudre ce problème. J’ai donc dû réimplémenter le code pour obtenir le drapeau à nouveau.

Le rédacteur du défi voulait probablement que vous écriviez du code pour automatiser cela. Pour ce faire, vous devrez rendre le défi un peu plus compliqué en faisant en sorte que tous les noms aient la même longueur (avec un peu de remplissage) et peut-être même vous assurer que la solution ne figure pas parmi celles choisies au hasard, mais qu’elles apparaissent uniquement au hasard. demander les 50 premières autres images dans les 10 secondes avec la même session ou quelque chose du genre. Mais peut-être que Burp Suite peut aussi aider à cela sans écrire de code. Voici quelques images que j’ai eues:

Ce fichier commence par regf, il pourrait donc s’agir d’un fichier de registre. Et en effet, c’est une ruche de registre. Je suis allé dans mon registre, j’ai créé une nouvelle clé et y ai chargé cette ruche. En fait, c’était une mauvaise idée. Je ne pourrais plus jamais supprimer toutes les sous-clés à cause d’autorisations manquantes. Même en prendre possession n’a pas fonctionné. Si quelqu’un a de bonnes idées, postez-les dans les commentaires.

Mais même en cherchant dans le registre, rien d’intéressant. Il n’y avait pas de HV17 à l’intérieur ou quelque chose de similaire, alors je me suis retrouvé coincé. Même exporter la ruche de registre entière en tant que fichier .reg (à base de texte) ne pouvait rien obtenir d’intéressant.

Je voulais en savoir un peu plus et trouver l’emplacement dans le registre, mais j’ai échoué et j’ai abandonné à cause du temps perdu. J’ai trouvé l’emplacement de la clé associée (près de GameDVR_GameGUID d48142dc-fba3-4430-80dd-c4eb0143a34e), mais rien de ce qui est lié à HV17 n’avait de valeur. En tout cas, nous avons notre drapeau.

print (”. join (chr (ord (a) ^ ord (b))) pour a, b en zip ({+ chr (103) + chr (5) + chr (6) + chr (24) + M + chr (90) + chr (7) + F + chr (30) + chr (95) + M + chr (12) + C + chr (20) + chr (95) + chr (1 + 1 + 1) + chr (88) + chr (11) + chr (25) + chr (92) + chr (7) + ER + chr (30) + F (chr) (91) + chr (88) + chr (19), 31415926535897932384626433832 )))

Il y a donc 73 caractères utilisés, dont 8 très rarement. Et certains personnages sont échappés avec une barre oblique inverse. Puis je me suis un peu coincé. Jusque-là, j’avais l’idée de vérifier la longueur des données mapFrom. Je pensais que base64 et d’autres codes avaient une certaine longueur (comme divisible par 4), alors j’ai vérifié la longueur. monnaie bitcoin La longueur était exactement de 73 caractères. Exactement le même que le nombre de personnages différents! C’était donc la clé! Nous avons un champ mapTo et mapFrom! Cela signifie que nous devons mapper les caractères du contenu de mapFrom à mapTo!

Je n’ai plus ce programme, mais vous verrez plus tard pourquoi. Dans le programme, j’ai créé une boucle for pour chaque caractère, recherché la chaîne dans mapFrom et créé une nouvelle chaîne à partir de mapTo en ajoutant chaque caractère. Ce programme a duré 45 minutes et a renvoyé une nouvelle fichier.

Alors maintenant, nous avons un op (opération) gzip. Je l’ai fait manuellement avec des outils en ligne et je suis passé à l’étape suivante. Ensuite nous avons op: b64 et certains données codées en base64 dans le contenu. Ok, nous pouvons le faire à nouveau manuellement. La prochaine étape était encore un gzip. Et puis une opération de carte à nouveau.

Comme la manipulation des chaînes dans l’opération de mappage était incroyablement lente, j’ai dû étudier comment l’optimiser. J’ai d’abord essayé de pré-commander la table de mappage dans un tableau, puis de faire des recherches simples au lieu de chercher dans mapFrom. Cela n’a pas aidé à augmenter la vitesse. Ensuite, j’ai découvert la classe StringBuilder, dans laquelle vous pouvez dire à l’avance la longueur de la chaîne et exécuter simplement une commande Ajout. Cela a réduit le temps d’exécution d’heures à moins d’une seconde. En effet, la récupération de place n’est plus effectuée dans la boucle et la chaîne reste en mémoire.

J’ai également dû implémenter du code d’analyse JSON, car ce n’est pas intégré à .NET. Partout où j’ai cherché, ils m’ont recommandé un logiciel tiers et je ne voulais vraiment pas utiliser d’autres composants. Je me suis retrouvé avec la classe JavaScriptSerializer, qui peut également être utilisée pour analyser JSON – elle n’a tout simplement pas beaucoup de fonctionnalités.

Donc, après avoir exécuté ceci, de nouvelles opérations sont apparues. Outre la carte déjà connue, gzip et b64, quatre autres apparaissent: nul (un autre json directement dans le contenu), xor (avec un nouveau masque de champ, une valeur codée en base64 sur un octet pour xor-décrypter le contenu qui est également codé en base64), rev pour inverser la chaîne JSON dans le contenu et marquer.

Il semble qu’ils aient ajouté un octet nul à la fin de l’indicateur dans la valeur hexadécimale. Je ne sais pas pourquoi ils ont fait ça. Comme ils ont mentionné un brusque forçage dans la description du défi, j’ai supposé que le résultat était plus grand que la plus petite valeur et que nous devions essayer des valeurs plus élevées, mais pour une raison quelconque, ce n’était pas le cas. Je ne sais pas pourquoi c’était aussi simple.

Une autre chose sur laquelle j’ai cherché était de savoir comment résoudre cette équation manuellement. Pour cet article, je l’ai fait manuellement sur du papier avec des nombres plus petits et j’ai commencé à le résoudre également. C’est beaucoup de travail. Donc, pour l’équation simple 363 = 17 * x mod 453, nous devrions savoir combien de fois nous devrions multiplier x par 17 pour boucler le 453. Cela donne 27 fois et aboutit à une valeur mod de 6. Si Je le fais maintenant plusieurs fois, je peux aussi envelopper ce 6, donc je reçois 76 avec une valeur mod de 3. Nous utilisons Bitcoin Le résultat 363 est divisible par 3, je peux donc l’utiliser. Nous avons maintenant 27 tours pour wrap1 et 76 tours pour wrap2. Cela donne 2052. Et comme 363 est divisible par 3 (= 121), nous calculons 2052 * 121 = 248292. Ce mod 453 donne maintenant 48. Et 48 est notre résultat final: x = 48 + n * 453, ce que vous pouvez prouver dans l’équation initiale. J’ai essayé cela avec les gros chiffres ci-dessus et n’ai progressé que lentement (environ 3 minutes par chiffre), alors j’ai abandonné. WolframAlpha est assez bon.

Vous avez dû saisir le drapeau vous-même. Si vous avez entré une mauvaise clé, une erreur s’est produite. Le code de montage a fait des comparaisons simples avec le drapeau dans le code (pas de texte en clair, en quelque sorte obscurci). Ainsi, après avoir entré un caractère, il a comparé la valeur à la première lettre du drapeau correct, comparant ainsi CMP r1, «H», ce qui signifie que vous saviez que le caractère correct était «H». J’ai avancé caractère par caractère et ai écrit le drapeau. Ce serait bien de désassembler statiquement tout le fichier ou d’autres choses, mais par manque de temps, je ne l’ai pas fait.

J’ai démonté le fichier binaire et constaté qu’il implémentait le cryptage RSA. En fait, vous n’auriez même pas besoin de compétences en ingénierie inverse, car la clé publique était visible sous forme décimale dans le vidage hexadécimal du fichier binaire (65537), ce qui indique déjà que RSA a été utilisé. La seule chose qui ne va pas sans compétences inversées serait d’obtenir le bon module, mais comme c’était le cas en ASCII (hex), cela ne devrait pas être trop compliqué. Nous avons donc la clé publique avec laquelle le drapeau a été chiffré: