$ cat hello.c
#include <stdio.h>
int fonction(void)
{
printf("Je suis dans la fonction\n");
return 0;
}
int main(void)
{
printf("Je suis dans le main\n");
return 0;
}
Un binaire ELF démarre par son entry point:
$ readelf -h hello | grep Entry
Entry point address: 0x80482d0
Si je change l'entry point par l'adresse de fonction, j'affiche "Je suis dans la fonction".
$ objdump -d hello | grep fonction
08048384 <fonction>:
$ hexdump -C hello | head -4
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 02 00 03 00 01 00 00 00 84 83 04 08 34 00 00 00 |............4...|
00000020 fc 09 00 00 00 00 00 00 34 00 20 00 07 00 28 00 |ü.......4. ...(.|
00000030 23 00 20 00 06 00 00 00 34 00 00 00 34 80 04 08 |#. .....4...4...|
Et donc:
$ ./hello
Je suis dans la fonction
Erreur de segmentation
Ca marche, mais ça plante.
En fait, l'entry point ne démarre pas dans main, mais dans une fonction _start qui doit faire des trucs. D'ailleurs, avec objdump, on voit qu'il se passe des trucs:
080482d0 <_start>:
80482d0: 31 ed xor %ebp,%ebp
80482d2: 5e pop %esi
80482d3: 89 e1 mov %esp,%ecx
80482d5: 83 e4 f0 and $0xfffffff0,%esp
80482d8: 50 push %eax
80482d9: 54 push %esp
80482da: 52 push %edx
80482db: 68 30 84 04 08 push $0x8048430
80482e0: 68 d0 83 04 08 push $0x80483d0
80482e5: 51 push %ecx
80482e6: 56 push %esi
80482e7: 68 a1 83 04 08 push $0x80483a1
80482ec: e8 b3 ff ff ff call 80482a4 <__libc_start_main@plt>
L'adresse de main est à 0x80483a1. Je pense que si je modifie le binaire à cet endroit pour y mettre l'adresse de fonction, tout se passera mieux:
000002E0 68 D0 83 04 08 51 56 68 84 83 04 08 E8 B3 FF FF h....QVh........Et:
$ ./hello
Je suis dans la fonction
$
Mitsurugi
Aucun commentaire:
Enregistrer un commentaire