6 votes

Impossible de trouver les fichiers .dtors et .ctors dans le binaire.

Je suis en train de lire le livre Hacking, the art of exploitation. Dans le livre il y a une section qui explique l'utilisation de .dtors y .ctors .

J'essaie de reproduire un des exercices du livre mais dans mon exécutable je n'ai pas ces sections. Au début, je pensais que le problème venait du fait que je compilais pour 64 bits, mais maintenant je compile pour 32 bits et je n'ai pas de sections. .dtors y .ctors n'apparaissent toujours pas dans le tableau des sections. Voici le code :

#include <stdio.h>
#include <stdlib.h>

static void
miConstructor(void) __attribute__ ((constructor));
static void
miDestructor(void) __attribute__ ((destructor));

int
main(void) {
printf("En main() \n");
return 0;
}

void
miConstructor(void) {
printf("En el constructor\n");
}

void
miDestructor(void) {
    printf("En el destructor\n");
}

Je compile avec :

 gcc -m32 -o a.out dtors_example.c

C'est la sortie de nm :

080495f0 d _DYNAMIC
080496e4 d _GLOBAL_OFFSET_TABLE_
080484dc R _IO_stdin_used
     w _ITM_deregisterTMCloneTable
     w _ITM_registerTMCloneTable
     w _Jv_RegisterClasses
080485d8 r __FRAME_END__
080495ec d __JCR_END__
080495ec d __JCR_LIST__
08049704 D __TMC_END__
08049704 A __bss_start
080496fc D __data_start
080483c0 t __do_global_dtors_aux
080495e4 t __do_global_dtors_aux_fini_array_entry
08049700 D __dso_handle
080495dc t __frame_dummy_init_array_entry
     w __gmon_start__
080484ba T __i686.get_pc_thunk.bx
080495e4 t __init_array_end
080495dc t __init_array_start
08048450 T __libc_csu_fini
08048460 T __libc_csu_init
     U __libc_start_main@@GLIBC_2.0
08049704 A _edata
08049708 A _end
080484c0 T _fini
080484d8 R _fp_hw
080482b8 T _init
08048320 T _start
08049704 b completed.5730
080496fc W data_start
08048350 t deregister_tm_clones
080483e0 t frame_dummy
0804840c T main
08048428 t miConstructor
0804843c t miDestructor
     U puts@@GLIBC_2.0
08048380 t register_tm_clones

La sortie de objdump ni le spectacle .dtors ou .ctors

Peut-être que les sections __init_array_end , __init_array_start ou __do_global_dtors_aux sont liés au comportement de .ctors y .dtors ?

10voto

pyton Points 116

Le problème vient probablement de gcc. Sous gcc 4.7 la version peut générer .ctors mais gcc 4.7 utilise .init_array au lieu de .ctors . vous pouvez le confirmer en effectuant la commande dont la liste figure ci-dessous. objdump -dr -j .ctors a.out .si aucune section n'est trouvée, essayez objdump -dr -j .init_array a.out ou vous pouvez faire ceci readelf -S a.out pour lister toutes les sections. vous trouverez alors .ctors ou(et) .init_array .

1voto

rakib Points 6571

Utilisez la commande objdump avec -x pour voir toutes les informations disponibles sur l'en-tête, la table des symboles et les entrées de relocalisation.

objdump -x ./yourcommand

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X