Un peu d'aide svp

sic_clash Messages postés 6 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 11 août 2005 - 8 août 2005 à 21:48
sic_clash Messages postés 6 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 11 août 2005 - 11 août 2005 à 15:25
Bien voila,
je m'interesse a l'asm depuis peu, et pour cela j'etudie des scripts pour tenter d'assimiler les sctructures syntaxes et deroulement.
Mais n'ayant pas trouvé de reponses dans les tutos, explications d'instructions et autres recherches, je poste ici en esperant de l'aide

voici donc mon probleme :

MOVZX EAX,BYTE PTR SS:[EBP-28]
CMP AL,BYTE PTR SS:[EBP-18]
JNZ SHORT hjerdfgi.00401329

Je ne comprends pas l'instruction MOVZX utilisé ici ni le rapprochement entre EBP-28 et EBP-18 .
je vous pris de bien vouloir pardonner mon ignorance et m'escuse si ce poste vous semble mal placé .

12 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 août 2005 à 22:15
movzx remplit l'octet bas de EAX donc AL et met les 3 octets hauts de EAX à ZERO.
Pour le reste, ben ça dépend de ce que doit faire ce prog.

ciao...
BruNews, MVP VC++
0
sic_clash Messages postés 6 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 11 août 2005
8 août 2005 à 22:34
merci bien de ta reponse, enfete c'est un programme "password" une sorte de crack-me enfin voici ce qu'il se passe apres la saisi du code :
MOVZX EAX,BYTE PTR SS:[EBP-28]
CMP AL,BYTE PTR SS:[EBP-18]
JNZ SHORT hjerdfgi.00401329
MOVZX EAX,BYTE PTR SS:[EBP-27]
CMP AL,BYTE PTR SS:[EBP-17]
JNZ SHORT hjerdfgi.00401329
MOVZX EAX,BYTE PTR SS:[EBP-26]
CMP AL,BYTE PTR SS:[EBP-16]
JNZ SHORT hjerdfgi.00401329
MOVZX EAX,BYTE PTR SS:[EBP-25]
CMP AL,BYTE PTR SS:[EBP-15]
JNZ SHORT hjerdfgi.00401329
MOV DWORD PTR SS:[ESP],hjerdfgi.00403034
CALL <JMP.&msvcrt.printf>
CALL <JMP.&msvcrt._getch>
MOV DWORD PTR SS:[EBP-2C],0
JMP SHORT hjerdfgi.00401341
MOV DWORD PTR SS:[ESP],hjerdfgi.0040305C

ca fait un bout de temps que je m'efforce de comprendre le stratageme ...
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
9 août 2005 à 10:25
A priori le programme compare les 4 octets successifs placés en EBP-28
...EBP-25 avec ceux placés en EBP-18 ...EBP-15. Si un des octets ne
coïncide pas on va en hjerdfgi.00401329 (ce qui doit déclancher plus
tard un message du type "va te faire voir") sinon l'adresse
hjerdfgi.00403034 est mise au sommet de la pile en écrasant ce
qui s'y trouvait. Ne serait-ce pas l'adresse de retour d'un sous
programme (si le morceau de code en est un). Dans ce cas s'il y a un
ret en fin du sous programme, le retour ne se fera pas à l'endroit
escompté mais à l'adresse hjerdfgi.00403034. Je pense que le même
principe est employé avec l' instruction MOV DWORD PTR
SS:[ESP],hjerdfgi.0040305C.



Par hazard, est-ce que l'adresse hjerdfgi.00401329 ne correspondrait
pas avec l'instruction MOV DWORD PTR SS:[ESP],hjerdfgi.0040305C ?
0
sic_clash Messages postés 6 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 11 août 2005
9 août 2005 à 10:36
Encors merci pour tes explications j'y vois plus clair maintenent, et en effet cette addresse correspond avec l'instruction MOV DWORD PTR SS:[ESP],hjerdfgi.0040305C :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sic_clash Messages postés 6 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 11 août 2005
11 août 2005 à 12:14
escusez moi encors pour mes questions mais je ne comprends toujours pas ce qu'est enfete EBP-18 ...
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
11 août 2005 à 13:27
esp est un pointeur qui désigne le sommet de la pile, [esp] est la
valeur de l'octet se trouvant à cet emplacement [esp+1] designe l'octet
suivant. Après un call [esp],[esp+1],[esp+2],[esp+3] contient le valeur
de retour (l'emplacement de l'instruction qui suit le call). Si dans le
sous programme tu effectue un push eax, esp est décrémenté de 4 (la
pile marque à l'envers) et l'adresse de retour se trouvera dans
[esp+4]--[esp+7]



ebp est un autre pointeur de pile qui n'est pas affecté par les push
(et pop). Il peut être plus commode de calculer les adresses à partir
de ce pointeur. Dans le cas précédent si tu fais

Call sousprogramme



;sousprogramme

mov ebp,esp ;esp pointe sur la valeur de eip qui suit l'appel du call

push eax ;décrémente esp de 4

[ebp] représente toujours eip

[esp] représente eax



Donc [ebp-18] correspond à la valeur située 18 octets avant ce que pointe ebp



Si tu avais fait

push eax

mov ebp,esp ;ebp pointe sur eax

push ebx ;esp pointe sur ebx (esp:=ebp-4)

push ecx ;esp pointe sur ecx (esp:=ebp-8)

push edx ;esp pointe sur edx (esp:=ebp-12)

push esi ;esp pointe sur esi (esp:=ebp-16)

push ax ;esp pointe sur ax (esp:=ebp-18)



Pour retrouver la valeur de eax sauvegardée tu peux faire:

mov eax,[esp+18] ;difficulté de ce baser sur un index mouvant

mov eax,[ebp] ;n'est ce pas plus simple ?

Ce n'est pas très compliqué mais il fait faire bien attention au nombre d'octets empilés
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2005 à 13:40
mov eax,[esp+18] ERREUR de frappe, toujours sur un multiple de 4 en system 32 bits, chaque PUSH empile 4 octets.

ciao...
BruNews, MVP VC++
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
11 août 2005 à 13:58
L'instruction push ax empile également 4 octets ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 août 2005 à 14:11
sur system 32 bits et prog 32, toujours 4 octets, éviter aussi cette écriture, 'push eax' et masque les 16 bits haut au besoin.

ciao...
BruNews, MVP VC++
0
sic_clash Messages postés 6 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 11 août 2005
11 août 2005 à 14:40
donc enfete le programme compare l'octet qui se trouve a 28 octets de ce que pointe EBP avec un autre octet qui se trouve a 10 octets de l'autre ?
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
11 août 2005 à 15:07
Affirmatif, tu dois avoir deux blocs de données, décalés de 10 octets
et qui sont comparés entre eux. Effectue également une analyse de
l'instruction

MOV DWORD PTR SS:[EBP-2C],0

A mon avis si tu intervertis les adresses hjerdfgi.00403034 et hjerdfgi.0040305C dans les

MOV DWORD PTR SS:[ESP]

tu risques de te faire avoir par ce qui se trouve en SS:[EBP-2C] plus tard.

L'interversion a pour but de rendre ce qui est mauvais (dans
99,999999999% des cas - probabilité d'avoir au moins 1 des 4 octets
différents des 4 recherchés) bon et vice versa
0
sic_clash Messages postés 6 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 11 août 2005
11 août 2005 à 15:25
hmmm ok merci a mon avi l'otre bloc de donné doit etre gere en dehor de ce sous programme je vais analyser un peu le code

petite remarque : ce qui m'etonne c'est quand je met en code 99999999999999999999, il me dit que le code est bon, alors je me demande si ca serait possible qu'enfete le programme repartit le code en plusieurs bloc ?
0
Rejoignez-nous