logo Homepage
+  NewbieContest
|-+  Divers» Cracking» problème lib création programme ASM
Username:
Password:
Pages: [1] 2
  Imprimer  
Auteur Fil de discussion: problème lib création programme ASM  (Lu 15439 fois)
prepa75

Profil challenge

Classement : 1019/54278

Membre Junior
**
Hors ligne Hors ligne
Messages: 97


Voir le profil
« 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 !
« Dernière édition: 10 Décembre 2012 à 22:09:21 par prepa75 » Journalisée
Ge0

Profil challenge

Classement : 16/54278

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« #1 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.
Journalisée
prepa75

Profil challenge

Classement : 1019/54278

Membre Junior
**
Hors ligne Hors ligne
Messages: 97


Voir le profil
« #2 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 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".
Journalisée
Ge0

Profil challenge

Classement : 16/54278

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« #3 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.
« Dernière édition: 11 Décembre 2012 à 08:40:50 par Geo » Journalisée
prepa75

Profil challenge

Classement : 1019/54278

Membre Junior
**
Hors ligne Hors ligne
Messages: 97


Voir le profil
« #4 le: 11 Décembre 2012 à 18:15:34 »

Ok nikel, merci de m'avoir aidé à y voir plus clair 

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.
Journalisée
prepa75

Profil challenge

Classement : 1019/54278

Membre Junior
**
Hors ligne Hors ligne
Messages: 97


Voir le profil
« #5 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é
Journalisée
harvey

Profil challenge

Classement : 12/54278

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #6 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
mov dword [eax], 100h
sont valides.
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
xor eax, [ebx]
sont valides, mais pas
Code:
xor dword [ebx], dword [eax]
Pareil, pour mov, add, sub, ... : tu ne peux pas réaliser une opération dont les deux paramètres sont des valeurs en mémoire. C'est une limitation du processeur. Les exceptions sont des instructions spéciales comme movsb, qui utilisent les registres esi et edi.


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.
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
pop eax
« Dernière édition: 18 Décembre 2012 à 06:38:17 par harvey » Journalisée

L'entropie vient en mangeant.
prepa75

Profil challenge

Classement : 1019/54278

Membre Junior
**
Hors ligne Hors ligne
Messages: 97


Voir le profil
« #7 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.
Journalisée
harvey

Profil challenge

Classement : 12/54278

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #8 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
mon_label: pop eax
Ça, ça devrait marcher. Tu auras l'adresse de mon_label dans eax.
Journalisée

L'entropie vient en mangeant.
prepa75

Profil challenge

Classement : 1019/54278

Membre Junior
**
Hors ligne Hors ligne
Messages: 97


Voir le profil
« #9 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 ? 
Journalisée
harvey

Profil challenge

Classement : 12/54278

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #10 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.
« Dernière édition: 14 Décembre 2012 à 04:21:28 par harvey » Journalisée

L'entropie vient en mangeant.
prepa75

Profil challenge

Classement : 1019/54278

Membre Junior
**
Hors ligne Hors ligne
Messages: 97


Voir le profil
« #11 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.
Cela dit, un gcc sous windows qui utilise msvcrt, ça existe: c'est MinGW.
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
Journalisée
Ge0

Profil challenge

Classement : 16/54278

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« #12 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).
Journalisée
prepa75

Profil challenge

Classement : 1019/54278

Membre Junior
**
Hors ligne Hors ligne
Messages: 97


Voir le profil
« #13 le: 14 Décembre 2012 à 08:22:47 »

Si ! Par exemple :
Code:
push 0xdeadbeef
ret
Ah nikel, je vais pouvoir m'amuser un peu avec ça j'ai oublier la fameuse adresse de retour...
Journalisée
prepa75

Profil challenge

Classement : 1019/54278

Membre Junior
**
Hors ligne Hors ligne
Messages: 97


Voir le profil
« #14 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.
Journalisée
Pages: [1] 2
  Imprimer  
 
Aller à: