Titre: problème lib création programme ASM Posté par: prepa75 le 10 Décembre 2012 à 21:48:30 Salut à tous,
j'ai décider de me créer un programme en assembleur pour comprendre les rouages internes. voici mon bout de code (minimaliste) global _main extern _printf section .text _main: push message call _printf ret section .data message: db 'Hello, World', 10, 0 Je le compile avec les commandes suivantes dans cygwin : nasm -f win32 test.asm -o test.obj gcc test.obj -o test.exe si ensuite je fait un ./test il marche nikel mais je suis obligé de mettre le cygwin/BIN dans le path (ce qui est normal vous me direz :)) Sinon j'ai droit à un beau "cygwin1.dll is missing from your computer" ma question est : comment pouvoir inclure dans mon programme les fonctions se trouvant dans les dll, de manière à ne pas se trimbaler la dll ? [Edit] au passage si quelqu'un pouvais m'expliquer à quoi sert 10 et le 0 dans "le message: db 'Hello, World', 10, 0" ? Merci d'avance pour vos réponses ! Titre: Re : problème lib création programme ASM Posté par: Ge0 le 10 Décembre 2012 à 22:43:31 Salut,
Citation ma question est : comment pouvoir inclure dans mon programme les fonctions se trouvant dans les dll, de manière à ne pas se trimbaler la dll ? Déjà je devine que tu es sous Windows. Essaie donc d'utiliser les fonctions exportées par les DLL de microsoft. msvcrt (Microsoft Visual C Runtime) exporte des fonctions de la libc telles que printf(), scanf()... Mais je ne connais pas nasm, donc je ne sais pas comment t'aider à faire ça ! Citation [Edit] au passage si quelqu'un pouvais m'expliquer à quoi sert 10 et le 0 dans "le message: db 'Hello, World', 10, 0" ? En ASCII, le caractère codé par la valeur 10 correspond à Line Feed, ou retour à la ligne ("\n"). Et le 0 correspond à l'octet NUL ("\0") car printf() attends en premier argument une chaîne "à la C", se terminant par un "null-byte", donc. D'où l'importance de placer le "0" après ton message. Le retour à la ligne est juste utile ici à des fins de lisibilité. Si tu exécutes ton programme dans un shell linux, tu verras ta ligne et le prompt juste après, ce qui n'est pas très "fancy" en soi. :) Si je peux te recommander un assembleur qui poutre, essaie fasm (http://flatassembler.net/). En ce qui concerne le format PE, j'aime beaucoup le fait de pouvoir coder ses propres tables d'importations pour utiliser des DLL sans avoir à passer par les .lib - et donc sous réserve connaître le prototype de tes fonctions, quels arguments elles attendent, et comment elle les prend en charge. C'est assez puissant et ça montre que si tu connais bien le format binaire d'un exécutable, tu peux faire tout et n'importe quoi avec ! J'espère que ça t'aidera. :) Titre: Re : problème lib création programme ASM Posté par: prepa75 le 10 Décembre 2012 à 23:05:17 Salut Geo,
thks pour tes explications ! Je pense que le problème vient lors du linkage avec gcc, il m'importe pleins de dll qui n'ont pas vraiment lieu pour un si petit bout de code... pour nasm j'ai pris un peu au pif, car tasm avait un nom bizarre et masm je n'aime pas la syntaxe. Je vais regarder de plus près flat. En tout cas il y a énormément d'exemple sur le site et ça c'est cool :D tu l'utilise sous windows ou linux ? sinon encore une question (oui je sais j'en ai pleins ^^) dans ma ligne "message: db 'Hello, World', 10, 0" le db veut dire "define byte", ok mais on est daccord que la chaine ne tiendra pas dans un octet et 1 seul octet c'est trop peu pour correspondre à une adresse du coup je ne comprend pas comment il peut récupérer la chaine quand on fait "push message". Titre: Re : problème lib création programme ASM Posté par: Ge0 le 11 Décembre 2012 à 08:34:25 Citation Je pense que le problème vient lors du linkage avec gcc, il m'importe pleins de dll qui n'ont pas vraiment lieu pour un si petit bout de code... Tu as compilé ton programme avec gcc sous cygwin, donc, ni plus ni moins, il utilisera la libc de cygwin qui est "enrobée" dans ses DLL. Quelque chose comme ça... J'utilise fasm sous Windows (pas encore eu l'occasion d'en faire sous mon Ubuntu). Citation dans ma ligne "message: db 'Hello, World', 10, 0" le db veut dire "define byte", ok mais on est daccord que la chaine ne tiendra pas dans un octet et 1 seul octet c'est trop peu pour correspondre à une adresse du coup je ne comprend pas comment il peut récupérer la chaine quand on fait "push message". En fait, c'est *exactement* la même chose qu'avec les pointeurs en C. Tu soumets à printf une adresse mémoire qui pointe sur le premier octet de ta chaîne (à savoir 'H'), et printf() va [formater la chaîne et] afficher les caractères un par un jusqu'à l'\0. Titre: Re : problème lib création programme ASM Posté par: prepa75 le 11 Décembre 2012 à 18:15:34 Ok nikel, merci de m'avoir aidé à y voir plus clair =D
pour moi db voulais dire que tu lui passe un octet en guise d'adresse, ce qui signifie que tu ne pouvais pas avoir plus de 255 données mais c'est bien une adresse de 4 octets. Titre: Re : problème lib création programme ASM Posté par: prepa75 le 13 Décembre 2012 à 18:40:27 Bonsoir,
me revoila ;) je me régale à utiliser flatasm, tu as raison il poutre bien ! Je suis en train de me fabriquer un Crackme et c'est particulièrement enrichissant. Cependant j'ai 2-3 questions d'ordre général sur l'assembleur : 1) est-ce normal que mov [eax],100h ne soit pas considéré comme une instruction valide ? en sachant que eax contient l'adresse d'une string, je souhaite remplacer les 4 1er caractères de la chaine par 00 01 00 00. du coup la solution que j'ai trouvé est de faire comme cela : mov ebx,100h mov [eax],ebx je trouve dommage de gaspiller un registre. 2) la réponse à la 1ère question répondra à la 2ème je pense : même problème avec xor [eax],[ebx], que j'ai remplacé par mov eax,[esi] ;chaine1 mov ebx,[edi] ;chaine2 xor eax,ebb mov [esi],eax add esi,4 add edi,4 ça me parait moche comme code quand même, il y a une manière plus propre ? 3) est-ce que les dll crypt32.dll et cryptdll.dll sont native dans windows ? 4) est-il possible de récupérer eip ? car mov eax,eip n'est pas accepté :/ Titre: Re : problème lib création programme ASM Posté par: harvey le 13 Décembre 2012 à 19:28:39 Citation 1) est-ce normal que mov [eax],100h ne soit pas considéré comme une instruction valide ? L'instruction est ambigüe. [eax] signifie simplement l'adresse référencée par eax, et il n'y a pas de type par défaut. L'assembleur ne peut pas deviner qu'il s'agit d'un dword (32 bit) plutôt que d'un word ou d'un qword. Il faut donc spécifier la taille d'au moins un des deux arguments:Code: mov [eax], dword 100h Ta solution fonctionne parce que la taille de ebx est connue. D'ailleurs quand je donne l'instruction fautive à nasm, il me dit: "error: operation size not specified"... Citation 2) la réponse à la 1ère question répondra à la 2ème je pense : même problème avec xor [eax],[ebx] Même problème en effet, mais pas seulement.Code: xor [eax], ebx Code: xor dword [ebx], dword [eax] Citation 3) est-ce que les dll crypt32.dll et cryptdll.dll sont native dans windows ? Il semble que la réponse soit oui mais. (http://msdn.microsoft.com/en-us/library/windows/desktop/aa379884(v=vs.85).aspx)Citation de: MSDN Crypt32.dll is a module that comes with the Windows and Windows Server operating systems, but different versions of this DLL provide different capabilities. There is no API to determine the version of CryptoAPI that is in use, but you can determine the version of Crypt32.dll that is currently in use by using the GetFileVersionInfo and VerQueryValue functions. Citation 4) est-il possible de récupérer eip ? car mov eax,eip n'est pas accepté Code: call 0 Titre: Re : problème lib création programme ASM Posté par: prepa75 le 13 Décembre 2012 à 20:25:49 Merci pour ta réponse complète, vu comme ça, mon code va être un peu plus propre.
Le seul bémol avec flatasm est le fait qu'il n'y ait pas de message d'erreur si une instruction est mauvaise. si il compile on peut toujours y aller au débuggeur mais lors du parssage statique il indique juste la ligne, sans autres explication. A moins qu'il y ai une configuration particulière à faire pour régler ce problème, et dans ce cas je suis passé à coté. pour la récupération de eip, le call 0 m'indique dans Ida que l'instruction 0x0 ne peut pas être exécuté, ça me parait bizarre quand même de récupérer eip comme ça. Titre: Re : problème lib création programme ASM Posté par: harvey le 13 Décembre 2012 à 20:48:13 Citation pour la récupération de eip, le call 0 m'indique dans Ida que l'instruction 0x0 ne peut pas être exécuté, ça me parait bizarre quand même de récupérer eip comme ça. En effet, je me suis planté. Code: call mon_label Titre: Re : problème lib création programme ASM Posté par: prepa75 le 13 Décembre 2012 à 21:11:25 nikel ça marche ;) sinon c'est pas possible de modifier eip à par passer par des Overflow nan ?
Titre: Re : Re : problème lib création programme ASM Posté par: harvey le 13 Décembre 2012 à 23:06:43 nikel ça marche ;) sinon c'est pas possible de modifier eip à par passer par des Overflow nan ? Euh, on utilise jmp ou call en général...Pour revenir à la question de départ: Citation ma question est : comment pouvoir inclure dans mon programme les fonctions se trouvant dans les dll, de manière à ne pas se trimbaler la dll ? Tu ne peux pas. Tu peux toujours lier le programme statiquement, mais ça revient à se trimballer la lib d'une autre manière.Cela dit, un gcc sous windows qui utilise msvcrt, ça existe: c'est MinGW. Titre: Re : problème lib création programme ASM Posté par: prepa75 le 14 Décembre 2012 à 08:19:07 Euh, on utilise jmp ou call en général... Oui je suis daccord avec toi, mais c'était pour faire un crackme un peu imprévisible ;) dailleurs j'ai réussi à faire 2-3 trucs sympa, mais est-ce que un BOF ou un HOF volontaire peut être un motif de refus de mon crackme pour des sites de challenges ? Je parle bien d'un bof que j'utilise dans le déroulement normal de mon programme. je n'ai pas trouvé de spécifications particulières la dessus. Tu ne peux pas. Tu peux toujours lier le programme statiquement, mais ça revient à se trimballer la lib d'une autre manière. justement, dans mon cas ça correspond à ce que je souhaite faire,comment dire que l'on souhaite inclure statiquement notre dll ? si j'utilise MinGW je vais devoir modifier toute la syntaxe de mon code qui compile sous flatasm :/ Cela dit, un gcc sous windows qui utilise msvcrt, ça existe: c'est MinGW. Titre: Re : Re : problème lib création programme ASM Posté par: Ge0 le 14 Décembre 2012 à 08:21:34 justement, dans mon cas ça correspond à ce que je souhaite faire,comment dire que l'on souhaite inclure statiquement notre dll ? si j'utilise MinGW je vais devoir modifier toute la syntaxe de mon code qui compile sous flatasm :/ Si ton réel souci est de ne pas te trimballer de dll à côté de ton crackme, n'aie aucune crainte quant à msvcrt.dll, elle se trouve déjà dans les dll "système" de Windows (avec kernel32, user32 et consort). Titre: Re : Re : Re : problème lib création programme ASM Posté par: prepa75 le 14 Décembre 2012 à 08:22:47 Si ! Par exemple : =) Ah nikel, je vais pouvoir m'amuser un peu avec ça j'ai oublier la fameuse adresse de retour...Code: push 0xdeadbeef Titre: Re : Re : Re : problème lib création programme ASM Posté par: prepa75 le 14 Décembre 2012 à 08:27:18 Oui dans mon cas c'est un petit soucy même si il n'en ai pas vraiment un car j'ai déja vu des crackme avec des dll à coté :) celle que je souhaite inclure est crypt32.dll et plus particulierement la fonction HashInit (ou Md5Init, je n'ai pas le code sous les yeux...) a moins que tu me conseille une fonction md5 un peu plus sympa sans devoir inclure une dll de 2Mo.
Titre: Re : problème lib création programme ASM Posté par: Ge0 le 14 Décembre 2012 à 08:49:23 crypt32.dll est aussi une dll système... Ça ne devrait pas poser problème, si ?
Titre: Re : problème lib création programme ASM Posté par: prepa75 le 14 Décembre 2012 à 09:22:03 Non sur les derniers Os je ne pense pas que ça pose un quelconque soucy :) d'après le lien de Harvey.
Si je te passe mon Crackme une fois fini, pourra tu me faire l'honneur de le tester ? ;) Titre: Re : problème lib création programme ASM Posté par: prepa75 le 14 Décembre 2012 à 14:13:31 Nikel ;) j'ai fini le squelette principal et je suis en train de réfléchir à un algo sympa pour la vérification du pass mais mon principal probleme est que soit la routine de vérification est trop simple (même pour moi :D) soit l'algo est à mon sens pas réversible.
Je n'ai pas envie de faire un crackme ou on passe 2heures à remonter 50 boucles xor, ça ne m'apporte pas grand chose pour la compréhension de l'ASM et pour le cracker c'est pas fun. Titre: Re : problème lib création programme ASM Posté par: prepa75 le 07 Janvier 2013 à 12:59:48 Et ben c'est pas une mince affaire de faire un bon crackme, il va falloir patienter encore un peu !
2-3 ptites complications :wink: |