dimanche 13 octobre 2013

ht editor

Puisqu'il est possible d'ajouter du trailing à un fichier ELF sans qu'il ne se passe rien, je me demande comment faire pour mettre du code dans ce trailing et pointer dessus en modifiant l'entrypoint. Ca devrait être simple, mais je trouve pas vraiment de manière de faire.

Ce dont j'ai besoin:
  • savoir comment le fichier du disque se retrouve en mémoire
  • savoir comment ajouter le trailing du fichier dans la mémoire
  • modifier l'entry point (ça c'est le + simple) ou modifier n'importe quel appel de fonction pour pointer sur mon code ajouté
Pour manipuler le fichier ELF, j'utilise ht editor qui m'évite à devoir calculer tous les offsets à la main.
Si je regarde les program headers par exemple (F6 puis program headers):

L'entry0 est le physical header. Il débute à 0x08048034, offset 0x34 soit 52. Cela rejoint donc ce qui dit la commande readelf:
$ readelf -e hello | grep program
  Start of program headers:          52 (bytes into file)

et nous pouvons trouver les suivants, et le mapping entre le fichier sur disque et le fichier en mémoire, il s'agit apparemment d'une conversion simple offset --> 0x08048000+offset. 

Vérifions à l'aide d'objdump -d:
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 84 83 04 08          push   $0x8048384
 80482ec:       e8 b3 ff ff ff          call   80482a4 <__libc_start_main@plt>
 80482f1:       f4                      hlt   
 80482f2:       90                      nop

Et dans le binaire, si je regarde à x02d0 jusqu'à 0x2f2
$ dd if=hello of=_start bs=1 count=35 skip=720
35+0 enregistrements lus
35+0 enregistrements écrits
35 octets (35 B) copiés, 0,00425817 s, 8,2 kB/s
$ hexdump -C _start  

00000000  31 ed 5e 89 e1 83 e4 f0  50 54 52 68 30 84 04 08  |1í^.á.äðPTRh0...|
00000010  68 d0 83 04 08 51 56 68  84 83 04 08 e8 b3 ff ff  |hÐ...QVh....è³ÿÿ|
00000020  ff f4 90                                          |ÿô.|
On retrouve le code.

Prochaines étapes:
  • vérifier ou se retrouve le trailer dans la mémoire
  • trouver dans les headers les tailles des différents objets, headers, programmes, etc..
Mitsurugi

Aucun commentaire:

Publier un commentaire