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 prochaincall
nextjmp
(peda): exécute jusqu’au prochainjmp
c
,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