Qu'est-ce que l'-fPIE option indépendante de la position des exécutables dans le gcc et ld?
Comment changer le code, par exemple, les appels de fonction?
Vous devez vous connecter pour publier un commentaire.
Comment changer le code, par exemple, les appels de fonction?
Vous devez vous connecter pour publier un commentaire.
La TARTE à l'appui de address space layout randomization (ASLR) dans les fichiers exécutables.
Avant de la TARTE à la mode a été créé, l'exécutable du programme ne pourrait pas être placé à une adresse au hasard dans la mémoire, qu'code indépendant de la position (PIC), les bibliothèques dynamiques pourraient être transféré à un décalage aléatoire. Il fonctionne très bien comme ce PIC ne pour les bibliothèques dynamiques, la différence est qu'une Procédure de Liaison de la Table (PLT) n'est pas créé, au lieu de PC par rapport à la réinstallation est utilisé.
Après l'activation de la TARTE à l'appui du ccag/linkers, le corps du programme est compilé et lié comme indépendant de la position du code. Un éditeur de liens dynamique ne délocalisation totale de traitement sur le module de programme, tout comme les bibliothèques dynamiques. Toute utilisation de données globales est converti à l'accès via le Mondial des Décalages de Table (GOT) et a OBTENU les délocalisations sont ajoutés.
TARTE est bien décrite dans cette OpenBSD TARTE à la présentation.
Changements de fonctions sont indiqués dans cette diapositive (PIE vs PIC).
et dans cette diapositive (PIE vs vieux style de liaison)
Noter que la TARTE peut être incompatible avec
-static
Minimum praticable exemple: GDB l'exécutable deux fois
Pour ceux qui veulent voir un peu d'action, nous allons voir l'ASLR travail sur la TARTE exécutable et le changement des adresses à travers les pistes:
principal.c
main.sh
La
-no-pie
, tout est ennuyeux:Avant de commencer l'exécution,
break main
définit un point d'arrêt à0x401126
.Puis, durant les deux exécutions,
run
s'arrête à l'adresse0x401126
.L'un avec
-pie
, cependant, est beaucoup plus intéressant:Avant de commencer l'exécution, GDB prend juste un "dummy" de l'adresse qui est présent dans le fichier exécutable:
0x1139
.Après il commence toutefois, GDB intelligemment avis que le chargeur dynamique placé le programme dans un emplacement différent, et la première pause arrêté à
0x5630df2d6139
.Ensuite, le deuxième terme aussi intelligemment remarqué que l'exécutable déménage de nouveau, et fini par casser au
0x55763ab2e139
.echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
assure que l'ASLR est activée (par défaut dans Ubuntu 17.10): Comment puis-je désactiver temporairement l'ASLR (Address space layout randomization)? | Ask Ubuntu.set disable-randomization off
est nécessaire sinon GDB, comme son nom l'indique, désactive l'ASLR le processus par défaut de donner des adresses fixes à travers les pistes pour améliorer l'expérience de débogage: Différence entre gdb adresses et les "vraies" adresses? | Débordement De Pile.readelf
analyseEn outre, nous pouvons également observer que:
donne la réelle de l'exécution de la charge d'adresse (pc souligné l'instruction de 4 octets après):
tout:
donne juste un décalage:
En tournant l'ASLR off (avec
randomize_va_space
ouset disable-randomization off
), GDB donne toujoursmain
l'adresse:0x5555555547a9
, donc on en déduit que la-pie
adresse est composée de:TODO où est 0x555555554000 codées en dur dans le noyau Linux /glibc chargeur /où? Quelle est l'adresse de la section de texte de la TARTE exécutable déterminé dans Linux?
Minimale de l'assemblée exemple
Une autre chose de cool que nous pouvons faire est de jouer avec certains assemblée de code pour comprendre plus concrètement ce qu'TARTE moyens.
On peut le faire avec un Linux x86_64 autonome assemblée bonjour tout le monde:
principal.S
GitHub en amont
et il assemble et fonctionne bien avec:
Cependant, si nous essayons de les lier comme la TARTE avec:
puis lien échouera avec:
Parce que la ligne:
code en dur l'adresse de message dans le
mov
opérande, et n'est donc pas indépendant de la position.--no-dynamic-linker
est nécessaire, comme l'a expliqué à: Comment créer statiquement indépendant de la position de l'exécutable ELF dans Linux?Si nous plutôt que de l'écrire dans une position indépendante:
puis TARTE lien fonctionne très bien, et GDB nous montre que l'exécutable est chargé à un autre emplacement dans la mémoire de tous les temps.
La différence ici est que
lea
codé l'adresse demsg
par rapport à l'actuelle adresse du PC en raison de larip
syntaxe, voir aussi: Comment utiliser RIP Adressage Relatif, dans la version 64 bits de l'assemblée programme?On peut aussi comprendre par le démontage des deux versions:
qui donne respectivement:
Nous voyons donc clairement que
lea
a déjà le plein de corriger l'adresse demsg
codé comme adresse actuelle + 0x19.La
mov
version a cependant de définir l'adresse de00 00 00 00
, ce qui signifie qu'un transfert sera effectué il y a: Ce n'linkers faire? énigmatiqueR_X86_64_32S
dans leld
message d'erreur est le type réel de déplacement qui est nécessaire et qui ne peut pas se produire dans la TARTE exécutables.Une autre chose amusante que nous pouvons faire est de mettre le
msg
dans la section de données au lieu de.text
avec:Maintenant la
.o
assemble pour:de sorte que le RIP décalage est maintenant
0
, et on devine qu'un transfert a été demandé par l'assembleur. Nous confirmons que avec:qui donne:
donc clairement
R_X86_64_PC32
est un PC par rapport à la réinstallation quild
peut manipuler pour TARTE exécutables.Cette expérience nous a enseigné que l'éditeur de liens se vérifie le programme peut être de la TARTE et de la marque en tant que telle.
Puis lors de la compilation avec GCC,
-pie
dit à GCC de générer indépendant de la position de l'assemblée.Mais si nous écrire assemblée nous-mêmes, nous devons vérifier manuellement que nous avons réalisé de position de l'indépendance.
En ARMv8 aarch64, l'indépendant de la position bonjour tout le monde, peut être atteint à l' ADR, instruction.
Comment faire pour déterminer si un ELFE est indépendant de la position?
En cours d'exécution à travers GDB, certaines méthodes statiques sont mentionnés à:
Testé sous Ubuntu 18.10.