Sommaire
Rétro-ingénierie
Désassemblage
Introduction
À l’aide de l’aide mémoire Pep/8, désassemblez manuellement le programme suivant: pin1
Aide mémoire Pep/8 (version INF600C)
Le reverse, c’est difficile
À l’aide du même aide mémoire Pep/8, désassemblez le programme suivant, puis faites-en la trace.
C0 FE FE 16 00 0D 70 65 70 38 00 41 00 06 00 0B 58
Pin 2: Des bogues
Désassemblez le programme Pep/8 suivant puis trouvez le bon PIN: pin2
Réponse (spoiler)
STRO pin,d
DECI n,d
LDA 1616,i
LDX 4,i
CALL get_pin
CPA n,d
BRNE k
LDA n,d
CALL print
STOP
k: STRO err,d
STOP
get_pin: SUBSP 2,i
STA 0,s
l: CPX 0,i
BRLE z
ASRA
ADDA 1,i
ADDA 0,s
STA 0,s
SUBX 1,i
BR l
z: LDA 0,s
RET2
print: SUBSP 2,i
STRO flag,d
DECO 0,s
CHARO '}',i
CHARO '\n',i
RET2
n: .BLOCK 2
pin: .ASCII "PIN:\x00"
flag: .ASCII "INF600C{\x00"
err: .ASCII "Erreur!\n\x00"
.END
En vrai
Trouvez également les bons PINs pour les versions 32 et 64 bits suivantes:
PIN 3
Ignorez le PIN et obtenez le flag dans chacun des deux programmes suivants:
Faites l’effort de soulever les différences dans le code du main entre x86 et x86_64.
Aide gdb/peda
Exécuter
run args: exécute depuis le début avec des argumentsstart(peda): exécute jusqu’au début du mainsi,stepi: exécute une instruction, entre dans les fonctionsni,nexti: exécute une instruction, n’entre pas dans les fonctionsfinish: exécute jusqu’à la fin de la fonctionnextcall(peda): exécute jusqu’au prochaincallnextjmp(peda): exécute jusqu’au prochainjmpc,continue: reprend l’exécutionb *adresse: met un point d’arrêt
Divers
- entrée: refait la dernière commande
q,quit: quitterh cmd,help cmd: affiche l’aidepeda: affiche les commandes peda
Inspecter
p expr: calcule et affiche une expression (en hexa par défaut)p/d expr: pareil mais en décimal (d’autres formats existent)x adresse: affiche le contenu d’une adressex/3db adresse: affiche 3 décimaux, chacun d’un octet (byte)telescope adresse(peda): affiche et déréférencepdisass foncton(peda): désassemble une fonctionbt,backtrace: affiche la pile d’appels
Modifier
set $reg = expr: modifier la valeur d’un registregoto adresse: modifier le compteur ordinalskipi(peda): ignorer une instruction (ça fait des bonds)return: quitter de force une fonction sans l’exécuterpatch adress valeur(peda): écrire une valeur en mémoire