En s'arrêtant à la première machine, du code d'instruction dans GDB
Après le chargement d'un fichier exécutable dans gdb, comment puis-je rompre au point d'entrée, avant la première instruction est exécutée?
L'exécutable, je suis de l'analyse est un morceau de malware qui est crypté donc break main
ne fait absolument rien.
Vous devez vous connecter pour publier un commentaire.
La
info files
commande peut vous donner une adresse, vous pouvez briser sur:fasm /dev/stdin test <<< $'format ELF executable\nint3'
.gdb
il montre0x10e0
. J'ai mis un point de saut, la course, et elle ne parvient pas à insérer un point d'arrêt. Mais à ce pointi files
montre0x5555555550e0
comme un point d'entrée. Et avec celui-ci, il fonctionne.De départ à l'aide de GDB 8.1, il y a une commande spéciale pour cela:
starti
. Exemple GDB session:Ce hack a été rendu obsolète par
starti
, mais utile si vous êtes coincé avec les anciens GDB.L'évidence de la solution est d'utiliser l'effet de bord de la défaillance pour définir un point d'arrêt:
(Vous devez
delete
le point d'arrêt non valide avant de poursuivre, ou en une seule étape.)Idée reprise de cette réponse à RE.SE.
stepi
a défaut, j'ai donc eu également utiliserdelete breakpoints
pour aller plus loin.d 1
. Pas besoin de supprimer toutes les."
b _start
" ou "b start
" peut ou peut ne pas fonctionner. Si non, trouver le point d'entrée de l'adresse avec readelf/objdump et utiliser "b *0x<hex address>
"._init
decru/init-first.c
semble être exécutée avant même_start
ou de l'entrée de l'adresse dans GCC 4.8 glibc 2.19 Ubuntu 14.04 quand j'essaieb _init; run
dans GDB. Ce qui se passe?Vous pouvez trouver ce que l'on appelle les fonctions avant de
int main()
avecset backtrace past-main on
et après les avoir mis un point d'arrêt et le redémarrage de votre programme: