
ASLR-Bypass ohne Infoleak
In diesem Artikel bespreche ich die Anwendung der Technik, die von Samuel Groß in seinem Blogbeitrag Remote iPhone Exploitation Part 2: Bringing Light into the Darkness -- a Remote ASLR Bypass beschrieben wurde, um ASLR unter Linux x86_64 zu umgehen.
Um das zu zeigen, werde ich eine Pwnable-Challenge von Buckeye CTF lösen, nämlich guess_god.
Ich werde versuchen, den Inhalt so anfängerfreundlich wie möglich zu halten. Du kannst also gerne jeden Abschnitt überspringen, wenn du dich sicher genug fühlst und nur den Exploit sehen möchtest.

Ich habe nicht am CTF teilgenommen, aber ich wurde etwa 2 Stunden vor dem CTF-Ende dank Guray00 auf die Challenge aufmerksam, der im fibonhack-Discord nach Hilfe bei einigen Krypto-Spielereien fragte.
Ich konnte ihm nicht helfen, aber ich habe mir die Pwnable-Challenges angesehen und dachte, es wäre gut, den P0-Blogbeitrag zu verstehen und hoffentlich diese Bounty zu bekommen.
Address Space Layout Randomization (ASLR) ist eine Computersicherheitstechnik, bei der die Basisadresse einer ausführbaren Datei sowie die Position von Bibliotheken, Heap und Stack im Adressraum eines Prozesses zufällig positioniert werden.
Unter Linux kannst du die Mappings eines Prozesses anhand seiner PID über procfs einsehen, indem du die Datei /proc/<pid>/maps liest.
Wenn du selbst ein Prozess bist und deine eigenen Speicher-Mappings kennen möchtest, kannst du /proc/self/maps lesen.
Zum Beispiel kannst du versuchen, /proc/self/maps mit cat zu lesen:```
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]
### Memory-Mapping-Muster
Wenn du das ein paar Mal machst, kannst du Folgendes ableiten:
* Die PIE-Basis des Binaries sollte im Bereich 0x00005500_00000000-0x00005700_00000000 liegen, was 2TB möglicher Adressen bedeutet.
* Der Heap befindet sich in der Nähe des Binaries.
* Bibliotheken liegen im Bereich 0x00007f00_00000000 - 0x00007fff_ffffffff, also 1TB möglicher Adressen.
* Der Stack liegt \(meistens\) im Bereich 0x00007ffc_00000000 - 0x00007fff_ffffffff, also 16gb möglicher Adressen.
* Der Bereich 0xffffffffff600000 - 0xffffffffff601000 ist immer gemappt. Wenn du dich fragst, was es ist, kannst du [diesen Artikel](http://terenceli.github.io/%E6%8A%80%E6%9C%AF/2019/02/13/vsyscall-and-vdso) lesen.
## 1.3 So umgeht man ASLR ohne Infoleak
Lass uns besprechen, was du tun kannst, um ASLR zu umgehen, wenn kein Informationsleck möglich ist.
Dies ist mein Versuch, zusammenzufassen, was ich aus Saelos Blogpost mitgenommen habe.