
Contournement d'ASLR sans fuite d'informations
Dans cet article, je vais discuter de l'application de la technique décrite par Samuel Groß dans son Remote iPhone Exploitation Part 2: Bringing Light into the Darkness -- a Remote ASLR Bypass, afin de contourner l'ASLR sur Linux x86_64.
Pour illustrer cela, je vais résoudre un défi pwnable du Buckeye CTF, guess_god.
Je vais essayer de garder le contenu aussi accessible que possible aux débutants, alors n'hésitez pas à sauter toute section si vous vous sentez assez confiant et que vous voulez juste voir l'exploit.

Je n'ai pas joué au CTF, mais je me suis intéressé au défi environ 2 heures avant la fin du CTF grâce à Guray00, qui demandait de l'aide sur le discord de fibonhack à propos de manigances cryptographiques.
Je n'ai pas pu l'aider, mais j'ai jeté un œil aux défis pwnable, et j'ai pensé que ce serait bien de comprendre le blogpost de P0 et, avec un peu de chance, d'obtenir cette prime.
Address Space Layout Randomization (ASLR) est une technique de sécurité informatique qui consiste à positionner de manière aléatoire l'adresse de base d'un exécutable ainsi que la position des bibliothèques, du tas et de la pile, dans l'espace d'adressage d'un processus.
Sur Linux, vous pouvez inspecter les mappings d'un processus à partir de son pid via procfs, en lisant le fichier /proc/<pid>/maps.
Si vous êtes un processus et que vous voulez connaître vos propres mappings mémoire, vous pouvez lire /proc/self/maps.
Par exemple, vous pouvez essayer de lire /proc/self/maps avec cat :```
root@088ec31b2ce9:/home/ctf/challenge# cat /proc/self/maps
55faeb01c000-55faeb01e000 r--p 00000000 fe:01 2497233 /usr/bin/cat
55faeb01e000-55faeb023000 r-xp 00002000 fe:01 2497233 /usr/bin/cat
55faeb023000-55faeb026000 r--p 00007000 fe:01 2497233 /usr/bin/cat
55faeb026000-55faeb027000 r--p 00009000 fe:01 2497233 /usr/bin/cat
55faeb027000-55faeb028000 rw-p 0000a000 fe:01 2497233 /usr/bin/cat
55faeb115000-55faeb136000 rw-p 00000000 00:00 0 [heap]
7fe15dfb1000-7fe15dfd5000 rw-p 00000000 00:00 0
7fe15dfd5000-7fe15dffb000 r--p 00000000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so
7fe15dffb000-7fe15e166000 r-xp 00026000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so
7fe15e166000-7fe15e1b2000 r--p 00191000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so
7fe15e1b2000-7fe15e1b5000 r--p 001dc000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so
7fe15e1b5000-7fe15e1b8000 rw-p 001df000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so
7fe15e1b8000-7fe15e1c3000 rw-p 00000000 00:00 0
7fe15e1c7000-7fe15e1c8000 r--p 00000000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so
7fe15e1c8000-7fe15e1ef000 r-xp 00001000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so
7fe15e1ef000-7fe15e1f9000 r--p 00028000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so
7fe15e1f9000-7fe15e1fb000 r--p 00031000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so
7fe15e1fb000-7fe15e1fd000 rw-p 00033000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so
7fff4388f000-7fff438b0000 rw-p 00000000 00:00 0 [stack]
7fff43989000-7fff4398d000 r--p 00000000 00:00 0 [vvar]
7fff4398d000-7fff4398f000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
root@088ec31b2ce9:/home/ctf/challenge# cat /proc/self/maps 55ffc0b1b000-55ffc0b1d000 r--p 00000000 fe:01 2497233 /usr/bin/cat 55ffc0b1d000-55ffc0b22000 r-xp 00002000 fe:01 2497233 /usr/bin/cat 55ffc0b22000-55ffc0b25000 r--p 00007000 fe:01 2497233 /usr/bin/cat 55ffc0b25000-55ffc0b26000 r--p 00009000 fe:01 2497233 /usr/bin/cat 55ffc0b26000-55ffc0b27000 rw-p 0000a000 fe:01 2497233 /usr/bin/cat 55ffc2108000-55ffc2129000 rw-p 00000000 00:00 0 [heap] 7f1ec6e0f000-7f1ec6e33000 rw-p 00000000 00:00 0 7f1ec6e33000-7f1ec6e59000 r--p 00000000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so 7f1ec6e59000-7f1ec6fc4000 r-xp 00026000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so 7f1ec6fc4000-7f1ec7010000 r--p 00191000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so 7f1ec7010000-7f1ec7013000 r--p 001dc000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so 7f1ec7013000-7f1ec7016000 rw-p 001df000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so 7f1ec7016000-7f1ec7021000 rw-p 00000000 00:00 0 7f1ec7025000-7f1ec7026000 r--p 00000000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so 7f1ec7026000-7f1ec704d000 r-xp 00001000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so 7f1ec704d000-7f1ec7057000 r--p 00028000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so 7f1ec7057000-7f1ec7059000 r--p 00031000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so 7f1ec7059000-7f1ec705b000 rw-p 00033000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so 7ffc72fa4000-7ffc72fc5000 rw-p 00000000 00:00 0 [stack] 7ffc72fe7000-7ffc72feb000 r--p 00000000 00:00 0 [vvar] 7ffc72feb000-7ffc72fed000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
### Schémas de mappages mémoire
Si vous faites cela quelques fois, vous pourriez en déduire que :
* La base PIE du binaire devrait se trouver dans la plage 0x00005500_00000000-0x00005700_00000000, ce qui signifie 2 To d'adresses possibles.
* Le tas est proche du binaire.
* Les bibliothèques se situent dans la plage 0x00007f00_00000000 - 0x00007fff_ffffffff, soit 1 To d'adresses possibles.
* La pile se trouve \(la plupart du temps\) dans la plage 0x00007ffc_00000000 - 0x00007fff_ffffffff, soit 16 Go d'adresses possibles.
* La plage 0xffffffffff600000 - 0xffffffffff601000 est toujours mappée, vous pouvez lire [cet article](http://terenceli.github.io/%E6%8A%80%E6%9C%AF/2019/02/13/vsyscall-and-vdso) si vous êtes curieux de savoir ce que c'est.
## 1.3 Comment contourner l'ASLR sans fuite d'informations
Voyons ce que vous pouvez faire pour contourner l'ASLR lorsqu'aucune fuite d'informations n'est possible.
Ceci est ma tentative de résumer ce que j'ai retenu de la lecture du billet de blog de Saelo.