Assembleur
Au début...
J'ai fait mes débuts en assembleur avec le microprocesseur 6502 de mon Oric. A cette époque, c'était normal de donner comme doc de l'ordinateur la doc du microprocesseur. Je l'ai notamment utilisé pour DAOric que j'ai publié sur Hebdogiciel.
J'ai poursuivi son utilisation sur Apple ][, puis j'ai évolué vers le 65C816 qui équipait mon Apple IIGS. Sur ces machines, le moniteur permettant de scrutter et modifier la mémoire était carrément implémenté de base. Incroyable!
Puis, à la faveur des langages plus évolués, l'assembleur a été mis de coté. Cependant, avec les CTF, c'est largement revenu sur le devant de la scène et j'aime bien... Justement pour me faciliter la vie pour les CTF, je liste ici un mémo des commandes courantes pour le débuggage gdb et une référence pour la bonne compréhension de l'assembleur x86.
gdb : Le débogueur en standard sur Linux
gdb est un débogueur générique qui permet d'attaquer du C ou de l'assembleur. Dans le cadre des CTFs, il est essentiellement utilisé pour l'assembleur.
Les commandes fondamentales que j'utilise très régulièrement sont les suivantes :
- start : Active le programme, mais ne l'exécute pas (pas encore...)
- break main.main ou main tout court : Permet de poser un point d'arrêt à l'entrée de la fonction main, fonction principale des programmes C
- si (raccourci de step instruction) : Execute l'instruction et, s'il s'agit d'un appel de routine (call), rentre dedans
- ni (raccourci de next instruction) : Execute l'instruction mais, s'il s'agit d'un appel de routine (call), NE rentre PAS dedans
- layout asm : Adopte la mise en page pour de l'assembleur
- / Ctrl x a pour sortir
- disassemble /m main.main,+100 : Désassemble la fonction main sur 100 lignes. Cette commande est nettement moins utilisée actuellement du fait de la configuration de mon environnement qui affiche systématiquement la version désassemblée.
- info r : Affiche les registres. Là cencore, cette commande est nettement moins utilisée du fait de la configuration de mon environnement qui affiche systématiquement les registres
- info local : Affiche les variables locales. Utilise surtout pour un programme dont on a la source.
- tui on : Active l'affichage TUI (Text User Interface)
- layout regs : Affiche la mise en page avec les registres visibles, dans le contexte tui
- Ctrl-x – o : Change la zone active pour l'utilisation des flèches
- tui reg all / tui reg general : Affiche tous les registres ou seulement les classiques
- x/10xb $rsp : Affiche les données à l'adresse du regsitre rsp (10 octets, en hexa)
Afin de paramétrer une fois pour toute mon environnement, mon fichier .config/gdb/gdbinit est le suivant :
add-auto-load-safe-path /usr/local/go/src/runtime/runtime-gdb.py set debuginfod enabled on define xxd dump binary memory dump.bin $arg0 $arg0+$arg1 shell echo "" | sed 's/$/^M/' shell xxd -g 4 -R always dump.bin | sed 's/$/^M/' shell rm dump.bin end set disassembly-flavor intel tui layout asm tui layout regs tui focus cmd

