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