Cours et tutorial la lecture de l’assembleur, tutoriel & guide de travaux pratiques en pdf.
LES FLAGS
Les Flags sont des bits uniques qui indiquent le statut de quelque chose. Le registre Flag sur les CPU modernes de 32 bits est de 32 bits. Il existe 32 Flags differents, mais ne vous en faites pas. En reversing, on n’en a besoin majoritairement que de 3: le ZFlag, le O-Flag et le C-Flag. On a besoin de connaitre et de comprendre le statut de ces flags pour savoir si un saut va etre éxécuté ou pas. Ce registre est en fait une collection de flags de 1 bit. Pensez à un flag comme à un drapeau, ou comme à un feu rouge: le vert veut dire « OK », et le rouge « PAS OK ». Un flag ne peut etre que 1 ou 0, c’est-à-dire fixé ou non-fixé.
Le Z-Flag
o Le Z-Flag (zero flag) est de loin le plus utile pour cracker. Il est utilisé dans à peu pres 90% des cas. Il peut etre fixé (statut = 1) ou ‘nettoyé’ (statut = 0) par plusieurs opcodes lorsque la derniere instruction éxécutée a pour resultat 0. Vous allez vous demander pourquoi CMP (voir plus loin) peut fixer le Flag Zero, puisqu’il compare quelque chose – mais comment peut-on avoir 0 en résultat d’une comparaison? Voyez plus loin pour la réponse…
Le O-Flag
o Le O-Flag (overflow flag) est utilisé dans a peu pres 4% des cas dans les tentatives de cracking. Il est fixé (= 1) lorsque la derniere opération a changé le bit le plus grand du registre qui a eu le résultat d’une opération. Par exemple: EAX contient la valeur 7FFFFFFF. Si l’on faisait une opération qui incrémente EAX de 1, le 0-Flag serait alors fixé car l’opération a changé le bit le plus haut de EAX (qui n’est pas fixé dans 7FFFFFFF, mais qui l’est dans 80000000 – utilisez calc.exe pour convertir de l’hexadecimal en binaire, ou encore ce petit outil
PDF Creator – PDF4Free v2.0 http://www.pdf4free.com
auquel j’ai ajouté un patch). L’autre cas ou le 0-Flag peut etre fixé, c’est quand la valeur du registre de destination n’est pas 0 avant l’instruction, ni après.
Le C-Flag
o Le C-Flag (Carry flag) est utilisé dans 1% des cas. Il est fixé si l’on ajoute une valeur au registre de manière à ce qu’il soit plus grand que FFFFFFFF, ou si l’on soustrait une valeur, de manière que la valeur du registre soit plus petite que 0.