Mémoire - protection : RELRO   Version imprimable de cet article Enregistrer au format PDF

RELocation Read-Only

Il s’agit d’une protection mise en place par GCC, permettant de demander au linker de résoudre les fonctions de bibliothèques dynamiques au tout début de l’exécution, et donc de pouvoir remapper la section GOT et GOT.plt en lecture seule.


par S3cur3D , Tosh

Voici un exemple de programme compilé avec full RELRO et sans :

  1. #include <string.h>
  2. #include <stdio.h>
  3.  
  4. void fake_printf(void) {
  5. puts("GOT overwriten !");
  6. }
  7.  
  8. int main(int argc, char **argv) {
  9. unsigned int *p = (void*)(strtol(argv[1], NULL, 0));
  10.  
  11. *p = (unsigned int)fake_printf;
  12. printf("Overwrite %p : OK !\n", p);
  13.  
  14. return 0;
  15. }

Télécharger

$ gcc test.c
$ readelf -r ./a.out | grep printf
08049790  00000107 R_386_JUMP_SLOT   00000000   printf
$ ./a.out 0x08049790
GOT overwriten !
$ gcc test.c -Wl,-z,relro,-z,now
$ readelf -r ./a.out | grep printf
08049fe8  00000107 R_386_JUMP_SLOT   00000000   printf
$ ./a.out 0x08049fe8            
Erreur de segmentation

On remarque que sans la Read-only relocation, on arrive sans problème à réécrire une entrée de la GOT et donc à changer le cours d’exécution d’un programme.

Ce qui n’est plus possible en activant la protection, comme le montre l’erreur de segmentation.

Documentations publiées dans cette rubrique Documentations publiées dans cette rubrique