Le test est sur Ubuntu 12.04, 32 bits, avec gcc
4.6.3.
En gros, je fais quelques manipulations binarys sur les binarys ELF et je dois maintenant assembler un programme d’assemblage et garantir que les symboles libc sont chargés sur une adresse prédéfinie.
Laissez-moi élaborer dans un exemple simple.
Supposons que, dans le code d’origine, les symboles libc stdout@GLIBC_2.0
soient utilisés.
#include int main() { FILE* fout = stdout; fprintf( fout, "hello\n" ); }
Lorsque je le comstack et vérifie l’adresse du symbole à l’aide de ces commandes:
gcc main.c readelf -s a.out | grep stdout
J’ai eu ceci:
0804a020 4 OBJECT GLOBAL DEFAULT 25 stdout@GLIBC_2.0 (2) 0804a020 4 OBJECT GLOBAL DEFAULT 25 stdout@@GLIBC_2.0
et la section .bss
est comme ceci:
readelf -S a.out | grep bss [25] .bss NOBITS 0804a020 001014 00000c 00 WA 0 0 32
Maintenant, ce que j’essaie de faire, c’est de charger le symbole stdout
dans une adresse prédéfinie, alors j’ai fait ceci:
echo "stdout = 0x804a024;" > symbolfile gcc -Wl,--just-symbols=symbolfile main.c
Puis, quand j’ai vérifié la section .bss
et le symbole stdout
, j’ai eu ceci:
[25] .bss NOBITS 0804a014 001014 000008 00 WA 0 0 4 4: 0804a024 0 NOTYPE GLOBAL DEFAULT ABS stdout 49: 0804a024 0 NOTYPE GLOBAL DEFAULT ABS stdout
Il semble que je n’ai pas chargé avec succès le symbole stdout@@GLIBC_2.0
, mais juste un stdout
câblé. (J’ai essayé d’écrire stdout@@GLIBC_2.0
en symbolfile
, mais la compilation est impossible …)
Il semble que comme je ne l’ai pas fait, l’adresse de début de la section .bss
a également changé, ce qui rend l’adresse du symbole stdout
dans une zone de non-section. Au cours de l’exécution, une erreur de segmentation est 0x804a024
lors du chargement à partir de 0x804a024
.
Quelqu’un pourrait-il m’aider à charger correctement le symbole de bibliothèque à une adresse prédéfinie? Merci!