sic_clash
Messages postés6Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention11 août 2005
-
8 août 2005 à 21:48
sic_clash
Messages postés6Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention11 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
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é .
sic_clash
Messages postés6Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention11 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 ...
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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 ?
sic_clash
Messages postés6Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention11 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 :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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
sic_clash
Messages postés6Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention11 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 ?