Appel système utilisé par malloc

System Call Used Malloc



Adresse source de l'article en anglais: Appels système utilisés par malloc

Avant de lire cet article, vous devez savoir malloc Utiliser les appels système pour obtenir de la mémoire. Comme le montre l'image ci-dessous, malloc transfer brk ou mmap Le système appelle pour obtenir la mémoire.



brk
brk En ajoutant brk L'emplacement obtient la mémoire du noyau (non initialisé par 0). Au début, la position initiale du tas (start_brk) et la position finale (brk) pointent vers le même emplacement.



  • quand ASLR Lorsqu'il est fermé, start_brk avec brk Pointera data/bss La fin du segment (end_data).



  • quand ASLR Lorsqu'il est activé, start_brk avec brk Est égal à data/bss La fin du segment (end_data) plus un décalage brk aléatoire.

Figure 15-1-6

Ci-dessus Process virtual address layout - L'image montre start_brk Est le début du segment de tas, brk (interruption de programme) est la fin du tas.



Exemple:

/* sbrk and brk examples */ #include #include #include int main() { void *curr_brk, *tmp_brk = NULL printf('Welcome to sbrk example:%d ', getpid()) /* sbrk(0) gives the break position of the program */ tmp_brk = curr_brk = sbrk(0) printf('Program Break Location1:%p ', curr_brk) getchar() /* brk(addr) Increase/decrease the break position of the program */ brk(curr_brk+4096) curr_brk = sbrk(0) printf('Program break Location2:%p ', curr_brk) getchar() brk(tmp_brk) curr_brk = sbrk(0) printf('Program Break Location3:%p ', curr_brk) getchar() return 0 }

Analyse de sortie:

  1. Procédure croissante break Avant, à travers les observations suivantes, nous pouvons voir qu'il n'y a pas de segment heap, donc, start_brk = brk = end_data = 0x804b000.

    root@xxxxx:~/ptmalloc.ppt/syscalls$ ./sbrk Welcome to sbrk example:6141 Program Break Location1:0x804b000 ... root@xxxxx:~/ptmalloc.ppt/syscalls$ cat /proc/6141/maps ... 0804a000-0804b000 rw-p 00001000 08:01 539624 /home/sploitfun/ptmalloc.ppt/syscalls/sbrk b7e21000-b7e22000 rw-p 00000000 00:00 0 ... root@xxxxx:~/ptmalloc.ppt/syscalls$
  2. Après l'augmentation, nous pouvons voir à travers la sortie ci-dessous heap Déjà, par conséquent, start_brk = end_data = 0x804b000 avec brk = 0x804c000.

    root@xxxxx:~/ptmalloc.ppt/syscalls$ ./sbrk Welcome to sbrk example:6141 Program Break Location1:0x804b000 Program Break Location2:0x804c000 ... root@xxxxx:~/ptmalloc.ppt/syscalls$ cat /proc/6141/maps ... 0804a000-0804b000 rw-p 00001000 08:01 539624 /home/sploitfun/ptmalloc.ppt/syscalls/sbrk 0804b000-0804c000 rw-p 00000000 00:00 0 [heap] b7e21000-b7e22000 rw-p 00000000 00:00 0 ... root@xxxxx:~/ptmalloc.ppt/syscalls$

c'est ici,

  • 0804b000-0804c000 est la plage de début / fin d'adresse virtuelle du tas.
  • Rw-p est un indicateur d'autorisation de lecture, d'écriture, d'exécutable, privé / partagé.
  • 00000000 est le décalage du fichier - car il n'est mappé à partir d'aucun fichier, il vaut donc 0 ici.
  • 00:00 Numéro de périphérique principal / secondaire - Il s'agit de 0 car il n'y a pas de mappage à partir d'un fichier.
  • 0 Numéro de nœud - 0 car il n'y a pas de mappage à partir du fichier.
  • [tas] Description du tas

mmap :

malloc use mmap Créer un segment de mémoire mappé privé. Le but est de demander un nouveau morceau de mémoire (0 padding), cette mémoire sera dédiée au processus appelant.

Exemple:

/* Create private memory using the mmap system call */ #include #include #include #include #include #include #include void static inline errExit(const char* msg) { printf('%s failed. Exiting the process ', msg) exit(-1) } int main() MAP_ANONYMOUS, -1, 0) if (addr == MAP_FAILED) errExit('mmap') printf('After mmap ') getchar() /* Unmap mapped region. */ ret = munmap(addr, (size_t)132*1024) if(ret == -1) errExit('munmap') printf('After munmap ') getchar() return 0

Analyse de sortie:

  1. Avant mmap, à travers la sortie ci-dessous, nous pouvons seulement voir qu'il appartient à la bibliothèque partagée. libc.so Avec ld-linux.so Carte mémoire:

    root@xxxxx:~/ptmalloc.ppt/syscalls$ cat /proc/6067/maps 08048000-08049000 r-xp 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 08049000-0804a000 r--p 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 0804a000-0804b000 rw-p 00001000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap b7e21000-b7e22000 rw-p 00000000 00:00 0 ... root@xxxxx:~/ptmalloc.ppt/syscalls$
  2. Après mmap, en observant, nous pouvons voir que le segment de la carte mémoire (b7e00000-b7e22000, la taille que nous avons définie 132k) et la carte mémoire déjà existante (b7e21000-b7e22000) sont combinés:

    root@xxxxx:~/ptmalloc.ppt/syscalls$ cat /proc/6067/maps 08048000-08049000 r-xp 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 08049000-0804a000 r--p 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 0804a000-0804b000 rw-p 00001000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap b7e00000-b7e22000 rw-p 00000000 00:00 0 ... root@xxxxx:~/ptmalloc.ppt/syscalls$

ici,

  • B7e00000-b7e22000 L'adresse virtuelle du segment
  • Rw-p est un indicateur d'autorisation de lecture, d'écriture, d'exécutable, privé / partagé.
  • 00000000 est le décalage du fichier - car il n'est mappé à partir d'aucun fichier, il vaut donc 0 ici.
  • 00:00 Numéro de périphérique principal / secondaire - Il s'agit de 0 car il n'y a pas de mappage à partir d'un fichier.
  • 0 est 0 car il n'y a pas de mappage du fichier.
  1. Après munmap, notre segment de carte mémoire a été renvoyé au système d'exploitation via la sortie ci-dessous.

    root@xxxxx:~/ptmalloc.ppt/syscalls$ cat /proc/6067/maps 08048000-08049000 r-xp 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 08049000-0804a000 r--p 00000000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap 0804a000-0804b000 rw-p 00001000 08:01 539691 /home/sploitfun/ptmalloc.ppt/syscalls/mmap b7e21000-b7e22000 rw-p 00000000 00:00 0 ... root@xxxxx:~/ptmalloc.ppt/syscalls$

Notez que dans notre programme ASLR est fermé.