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é
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