samedi 5 octobre 2013

Changement de l'entry point

Un peu de code:
 $ 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:

Publier un commentaire