Help ! Compréhension de programme en assembleur - ASM - Programmation
Marsh Posté le 01-11-2004 à 18:06:15
Qu'est-ce que tu as fait/trouvé déjà ?
Je suis en train de la faire et ça m'a pas l'air très compliqué...
Marsh Posté le 01-11-2004 à 18:45:47
Salut !
J'ai compris que :
- le main() demande le nom puis le code ; elle appelle la fonction f00401162() en lui donnant le nom et le code en paramètre
- la fonction f00401162() appelle f004010DF() en lui donnant le code et 0h10
J'ai vraiment du mal à voir ce qu'il fait avec la fonction f004010DF() :-?
Au retour de cette fonction, j'ai vu qu'il comparait le premier caractère du code à 0h2D (ligne 363).
Ensuite, il pointe vers la 2nde lettre du code, push 0h14 et rappelle f004010DF(). Au retour, il compare à nouveau avec 0h2D (ligne 393).
J'ai essayé de mettre un code qui commence par "--" (2D est le code ASCII du tiret), mais après avoir passé ces 2 étapes, il compare mon nom à quelque chose de vide...
Voilà. Pourrais-tu m'éclaircir au moins sur la structure générale du programme, me donner des conseils, savoir quand le nom intervient...
Merci beaucoup pour ton aide :-)
Nico.
Marsh Posté le 01-11-2004 à 21:02:43
(je bosse direct en assembleur car le .c est quasi illisible)
Donc tu as compris que le code est en 3 parties (recherche des 2 tirets + appels à la fonction f004010DF() 3 fois).
Citation : |
En fait on a : int f004010DF(char *code, int diviseur);
Citation : |
Cette fonction ne fait que de la conversion en fait (en fonction du diviseur). L'analyse de cette fonction est faite de manière très succinte mais on a compris le fonctionnement (conversion par division).
Citation : |
Ex: nikodan = 6f6b696e-2544ec-V18uS2
Par contre pour les noms de moins de 7 caractères, ça doit être plus chaud car on joue avec l'aléatoire...
Marsh Posté le 01-11-2004 à 21:04:02
Au fait merci pour ce petit exercice, ça fait du bien de faire chauffer les méninges
Marsh Posté le 01-11-2004 à 21:24:53
BMenez a écrit : Au fait merci pour ce petit exercice, ça fait du bien de faire chauffer les méninges |
ouais mais bon, t'as pas l'impression d'être hors charte là ? parce que tu lui as carrément résolu son exo !
Marsh Posté le 01-11-2004 à 21:35:13
Harkonnen a écrit : ouais mais bon, t'as pas l'impression d'être hors charte là ? parce que tu lui as carrément résolu son exo ! |
Non, j'ai pas l'impression d'être hors charte
Je m'excuse si je suis allé un peu loin
Marsh Posté le 01-11-2004 à 22:07:25
Merci beaucoup pour tes explications ! Je me penche dessus dès ce soir (je suis en cours... au Québec :-p ...)...
Et ne vous inquiétez pas, je suis vraiment pas du genre à résoudre un exercice sans le comprendre :-)
Merci encore,
A plus si j'ai encore des questions ;-)
Nico.
Marsh Posté le 02-11-2004 à 03:48:48
Bon, ben j'avoue que j'ai quand même passé un peu de temps sur tes explications...
En fait, ça peut paraître con, mais j'ai pas tout de suite compris qu'il comparait la 1ère partie du nom avec la première partie du code "multipliée" par 10h (pas habitué à ce genre de multiplication :s), puis qu'il comparait la 2ème partie du nom avec la deuxième partie du code "multipliée" par 14h, et pareil avec la somme des deux parties du nom, la 3ème partie du code et 24h.
J'ai aussi bloqué dans la division de la deuxième partie du nom. Je me retrouvais avec un reste de 19 et je savais pas quoi en faire (mais en fait c'était juste un "j" )
Mais j'ai perséveré, et maintenant j'ai bien compris
Merci beaucoup de ton aide !
Nico.
PS : pour "nicolas", "6f63696e-2753j0-v14n2y"
Marsh Posté le 02-11-2004 à 05:21:13
Re !
Je voulais juste te demander pourquoi ça poserait problème pour les noms de moins de 7 caractères... ?
J'ai fait un test avec 1 nom de 6 lettres, et le calcul semble se faire aussi bien... Enfin, j'ai peut-être eu de la chance ?
Marsh Posté le 02-11-2004 à 10:16:09
En fait c'est cette instruction qui me gène :
Citation : |
Si le nom fait moins de 7 caractères, on ne sait pas ce qu'il peut y avoir à EAX+4
Avec "HFR" par exemple :
Citation : |
"69 00 00 40" <= c'est quelquechose qui est mis automatiquement à l'initialisation du programme (toutefois cette valeur semble constante...) donc je ne vois pas comment tu peux faire le calcul sans connaitre cette valeur à l'avance. Si tu me dis que ça marche je te crois mais je ne comprends pas pourquoi.
Marsh Posté le 01-11-2004 à 01:17:51
Salut à tous !
Je suis étudiant et je suis des cours de sécurité informatique. Dans le cadre d'un cours, je dois analyser un programme en assembleur(*) afin de trouver la clé correspondant à un login et de le "craquer".
* Le programme a été écrit en C, compilé, décompilé, puis des instructions en C ont été placées à côté de l'assembleur pour nous "aider".
Le programme fait tout simplement ceci :
- il demande un nom ;
- il demande un code ;
- si la clé est bonne, il affiche que le code est correst, sinon qu'il n'est pas correct.
Et mon exercice consiste à analyser le code pour trouver la clé correspondant, par exemple, à mon prénom (nicolas).
Important :
- il s'agit d'un exercice, ce n'est pas du tout pour cracker d'autres logiciels ;
- il ne s'agit pas de faire un générateur de clé, juste de trouver au moins une clé correspondant à un nom.
Bref, je bloque.
J'ai vu que le programme, dans le main(), appelait une première fonction en lui envoyant les adresses du nom et du code, puis que cette méthode appelait 3 fois (au maximum) une méthode qui effectue des opérations sur les lettres du code. Mais je ne vois pas trop le lien entre les lettres du code et nom.
Pourriez-vous m'aider s'il vous plaît ? Me donner des indications, des conseils ??
Merci d'avance !
J'ai mis le code et un exécutable ici (pas de virus, rien, c'est sans danger, je vous l'assure) : http://emacoq.free.fr/bazar/prgm.zip