logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» ASM : questions débutants
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: ASM : questions débutants  (Lu 6720 fois)
Echap

Profil challenge

Classement : 1207/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 35


Voir le profil
« le: 29 Octobre 2010 à 13:20:56 »

Salut all,

je suis depuis plusieurs jours sur une épreuve de la section cracking et j'essaye tant bien que mal de comprendre l'enchainement des instructions du crackme en question. J'ai lu pas mal de docs sur l'ASM mais malheureusement toutes mes interrogations n'ont pas trouvé de réponses.

1. Que signifie [LOCAL.X] où X un nombre. Par exemple :
Code:
LEA EDX, [LOCAL.30]

2. A quoi ça sert de faire un TEST AL, AL ? Ca renvoie forcément 1 non ?

3. CALL <JMP.&msvcrt.printf> implique que l'on va chercher l'adresse de la fonction printf ?

4. Quelle est la signification du "." et des "< >" dans l'exemple 3 ?


Je pense que en ayant réponse à ces questions je pourrai bien avancer dans mon épreuve et pourquoi pas la terminer  .

Merci à vous.
Journalisée
Asteriksme
Modérateur Global

Profil challenge

Classement : 37/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 785

.


Voir le profil WWW
« #1 le: 29 Octobre 2010 à 13:56:17 »

Salut,

1. Change de version de ollydbg, et observe, tu comprendras.
2. Intéresse-toi aux flags modifiés lors de cette opération.
3. Ça veut juste dire qu'on appelle la fonction printf
4. Pour les points, pense à la programmation objet; pour les crochets, c'est pour pas avoir CALL 0x00401034

Pour plus d'informations, lis la doc de ollydbg; je sais pas si y a une documentation officielle, mais y a pas mal d'infos ici : http://webster.cs.ucr.edu/AsmTools/OllyDbg/DisAsmreadme.htm
Bonne chance !
Journalisée

"It's a funny thing about some mathematicians. We often don't care if the results have applications because the results are themselves so pretty."
Echap

Profil challenge

Classement : 1207/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 35


Voir le profil
« #2 le: 29 Octobre 2010 à 16:41:25 »

1. Change de version de ollydbg, et observe, tu comprendras.

Tout d'abord merci pour ta réponse.

Pour ce qui est de la 1, LOCAL.X aurait-il un rapport avec les chaines de caractères et le registre d'offset BP ? D'après ce que j'ai compris, on utilise ce registre lors d'une manipulation d'une chaine. Et cela correspond assez bien au crackme que j'étudie.

Mais bon, j'ai pas réellement compris. Je pense qu'il me faudrait une bonne doc sur le fonctionnement de la mémoire car sans ça c'est bien chaud de comprendre l'ASM.

Une question bête : et le mémoire RAM dans tout ça ? On parle que de registres à chaque fois... Dans un programme en C si je créer une variable var = x; la valeur de var sera bien stockée en mémoire RAM non ? Alors quand est qu'on utilise les registres 
Journalisée
Nil

Profil challenge

Classement : 77/54254

Membre Complet
***
Hors ligne Hors ligne
Messages: 223


Voir le profil WWW
« #3 le: 29 Octobre 2010 à 17:11:30 »

C'est une excellente question pour les registres. La réponse simple et rapide est que c'est plus rapide d'avoir des registres.
Si tu as du code qui ressemble à
Code:
int x = 1;
int y = 2;
cout << x + y;
x et y sont en RAM comme tu le crois, mais les processeurs ne travaillent PAS directement avec la RAM. Ils travaillent avec les registres parce que c'est rapide en malade. Donc, lorsqu'il a besoin de x, il ld (load) la valeur à l'adresse de x à partir de la RAM puis la met dans le registre demandé (par le compilateur ou par le programmeur). Il faut la même chose avec y. Puis, finalement, il add (additionne) les deux registres. C'est globalement ce qui se passe.

Je peux probablement te faire une réponse un peu plus complète si tu veux

EDIT : En fait, je vais te faire une réponse beaucoup plus complète. Tellement complète que tu n'auras pas le goût de la lire. Donne moi quelques minutes.
« Dernière édition: 29 Octobre 2010 à 17:48:03 par Nil » Journalisée
Echap

Profil challenge

Classement : 1207/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 35


Voir le profil
« #4 le: 29 Octobre 2010 à 17:54:14 »

x et y sont en RAM comme tu le crois, mais les processeurs ne travaillent PAS directement avec la RAM. Ils travaillent avec les registres parce que c'est rapide en malade. Donc, lorsqu'il a besoin de x, il ld (load) la valeur à l'adresse de x à partir de la RAM puis la met dans le registre demandé

Ah ok et les variables sont stockées en RAM par soucis de place et d'organisation avant d'être load (quand on les appelle je suppose) dans les registres ?

Code:
int x;
int y;
int z;

cout << x + y;

Ici nos trois variables sont placées quelque part dans la RAM. Les variables x et y sont chargées dans des registres mais pas z car pour le moment inutile au programme c'est bien ça ?

Je suppose qu'un registre peut contenir au maximum une variable. Imaginons que je veuille faire une addition avec 20 variables, je n'aurai pas assez de registres donc c'est là que l'on utilise la pile ?

Ce que j'aime bien avec l'ASM c'est qu'une réponse amène souvent une autre question comme si on pouvait jamais boucler la boucle  .
Journalisée
Nil

Profil challenge

Classement : 77/54254

Membre Complet
***
Hors ligne Hors ligne
Messages: 223


Voir le profil WWW
« #5 le: 29 Octobre 2010 à 17:56:59 »

Yep, tu as globalement raison. Je suis en train d'écrire un petit tutoriel avec beaucoup plus d'explications; ça devrait répondre à tes questions sur la mémoire.
Journalisée
Echap

Profil challenge

Classement : 1207/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 35


Voir le profil
« #6 le: 29 Octobre 2010 à 18:01:53 »

Yep, tu as globalement raison. Je suis en train d'écrire un petit tutoriel avec beaucoup plus d'explications; ça devrait répondre à tes questions sur la mémoire.

Merci ! J'espère que je vais comprendre !

Je trouve que ce point là est pas expliqué ou alors très mal sur la plus part des PDF que j'ai pu lire. C'est lourd car certaines choses fondamentales ne sont que très peu expliquées ce qui fait que par la suite on comprend que vaguement ce que l'on fait.
Journalisée
_o_
Relecteur

Profil challenge

Classement : 42/54254

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #7 le: 29 Octobre 2010 à 19:02:49 »

Je pense qu'il est fondamental, avant de se lancer dans la programmation assembleur ou la rétro-ingénierie, de maîtriser les notions concernant les composants matériels d'un ordinateur. C'est à dire : CPU (registres, unités de calcul...), mémoire, bus, interruptions,  etc. Sans cela, l'assembleur est un peu une grosse bête exotique et rustique. Et je pense que la plupart des docs que tu as pu lire font l'hypothèse (probablement implicite) que ces concepts sont connus.

Je ne peux que te conseiller d'essayer de trouver des papiers décrivant le fonctionnement au niveau matériel d'un ordinateur. Pas forcément quelque chose de très détaillé, il s'agit juste de connaître les grandes classes de composants, leur fonctionnement, leurs points forts et leurs points faible.

Je constate que dans les vieux modes d'emploi des années 80 (dont les Rodnay Zaks sur les 6809, 6502 et Z80 pour parler de ceux que je possède), même ceux ne faisant que décrire le basic des nos chers micro-ordinateurs de l'époque, l'introduction décrivait toujours à minima les composants matériels de cette curieuse boite que l'on avait acheté. Mais cela n'a plus aucun intérêt pour Mme Michu, hélas.

Nostalgie de Sybex...
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
MaZ

Profil challenge

Classement : 393/54254

Membre Junior
**
Hors ligne Hors ligne
Messages: 59


Voir le profil
« #8 le: 29 Octobre 2010 à 19:32:26 »

Ah le 6502, ça me rappelle une épreuve ça
Journalisée
Echap

Profil challenge

Classement : 1207/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 35


Voir le profil
« #9 le: 29 Octobre 2010 à 21:07:00 »

Je ne sais pas si c'est bien de poser toutes mes questions personnelles ainsi (si tel est le cas merci de me l'indiquer) mais j'en ai d'autres. Encore une fois, c'est une question basique que tout débutant, je pense, pourrait être amené à se demander. Aussi, sachez que ces questions, je me les pose depuis longtemps sans trouver de réponses compréhensibles pour moi simple mortel...

Bref,

lorsque j'ouvre Windasm et que je fais un Goto Code Start il m'envoit à l'adresse 00401000. Si je fais la même chose avec Olly, je me trouve à l'adresse 00401320. Pourquoi le code ne début pas aux mêmes adresses ? C'est pourtant le même crackme que je désassemble !

De plus, avec Olly, j'ai une suite d'instructions avant le début du code. Qu'est ce que cela veut dire, à quoi elles servent ? Ce sont des instructions utiles aux bibliothèques ?

Merci encore
Journalisée
Nil

Profil challenge

Classement : 77/54254

Membre Complet
***
Hors ligne Hors ligne
Messages: 223


Voir le profil WWW
« #10 le: 29 Octobre 2010 à 23:30:28 »

Hum, si quelqu'un connaît la réponse à sa première question, j'aimerais aussi savoir.
Journalisée
harvey

Profil challenge

Classement : 12/54254

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


Voir le profil WWW
« #11 le: 30 Octobre 2010 à 00:18:54 »

Citation
Si je fais la même chose avec Olly, je me trouve à l'adresse 00401320.
L'endroit où ollydbg te donne la main est configurable, sous l'onglet "events" des options.
Il y a trois choix possibles dans la version 1.10: "System breakpoint", "entry point of main module" et "winmain".
"System breakpoint", c'est avant le chargement des dll.
Pour la différence entre "entry point of main module" et "Winmain", voir http://win32assembly.online.fr/tut3.html .
Probablement qu'ollydbg breake sur la fonction winmain, et windasm sur l'entry point.

Quant à la notation "LOCAL.X", il me semble que c'est aussi configurable (onglet analysis 1). Ça se réfère aux variables locales d'une procédure. Il y a en effet un rapport avec EBP. Le registre EBP reste en principe fixe au cours d'une procédure, et sert à pointer dans la pile la limite entre les arguments d'une procédure et ses variables locales. "LOCAL.X" est une autre manière de dire "EBP - 4x", de même que "ARG.X" doit vouloir dire "EBP+4x+8", ou quelque chose comme ça.

EDIT
Citation
"System breakpoint", c'est avant le chargement des dll.
Chouette, j'ai encore dit n'importe quoi. Manifestement, un certain nombre de dll sont déjà en mémoire à ce moment là. En tout cas, c'est avant l'appel des TLS callbacks (s'il y en a).

RE-EDIT
Je viens de me servir de Windasm, et il apparaît que j'ai encore dit n'importe quoi (mais qui en doutait vraiment ?). "Go to code start" dans windasm signifie aller à l'entrée du segment exécutable (qui n'a aucune raison particulière d'être le point d'entrée). Est-ce que c'est la peine que j'explique ? Non, personne ne lira.
Enjoy !
« Dernière édition: 19 Novembre 2010 à 04:37:49 par harvey » Journalisée

L'entropie vient en mangeant.
Echap

Profil challenge

Classement : 1207/54254

Néophyte
*
Hors ligne Hors ligne
Messages: 35


Voir le profil
« #12 le: 30 Octobre 2010 à 19:23:52 »

Je vous remercie pour toutes ces précisions   .
Journalisée
Pages: [1]
  Imprimer  
 
Aller à: