4.8 KiB
Relro
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Relro
RELRO oznacza Relocation Read-Only i jest funkcją zabezpieczeń stosowaną w plikach binarnych w celu złagodzenia ryzyka związanego z nadpisywaniem GOT (Global Offset Table). Istnieją dwa rodzaje ochrony RELRO: (1) Partial RELRO i (2) Full RELRO. Oba rodzaje reorganizują GOT i BSS z plików ELF, ale z różnymi wynikami i implikacjami. Konkretnie, umieszczają sekcję GOT przed BSS. To znaczy, że GOT znajduje się pod niższymi adresami niż BSS, co uniemożliwia nadpisywanie wpisów GOT przez przepełnianie zmiennych w BSS (pamiętaj, że zapis do pamięci odbywa się od niższych do wyższych adresów).
Rozłóżmy koncepcję na dwa odrębne typy dla jasności.
Partial RELRO
Partial RELRO przyjmuje prostsze podejście do zwiększenia bezpieczeństwa bez znaczącego wpływu na wydajność binariów. Partial RELRO sprawia, że .got jest tylko do odczytu (część nie-PLT sekcji GOT). Pamiętaj, że reszta sekcji (jak .got.plt) jest nadal zapisywalna i, w związku z tym, podatna na ataki. To nie zapobiega nadużywaniu GOT z wrażliwości na dowolne zapisy.
Uwaga: Domyślnie GCC kompiluje pliki binarne z Partial RELRO.
Full RELRO
Full RELRO zwiększa ochronę, czyniąc całą GOT (zarówno .got, jak i .got.plt) oraz sekcję .fini_array całkowicie tylko do odczytu. Gdy plik binarny się uruchamia, wszystkie adresy funkcji są rozwiązywane i ładowane w GOT, a następnie GOT jest oznaczany jako tylko do odczytu, co skutecznie zapobiega jakimkolwiek modyfikacjom w czasie wykonywania.
Jednak kompromis związany z Full RELRO dotyczy wydajności i czasu uruchamiania. Ponieważ musi rozwiązać wszystkie dynamiczne symbole podczas uruchamiania przed oznaczeniem GOT jako tylko do odczytu, pliki binarne z włączonym Full RELRO mogą doświadczać dłuższych czasów ładowania. Ten dodatkowy narzut przy uruchamianiu to powód, dla którego Full RELRO nie jest domyślnie włączony we wszystkich plikach binarnych.
Można sprawdzić, czy Full RELRO jest włączony w pliku binarnym za pomocą:
readelf -l /proc/ID_PROC/exe | grep BIND_NOW
Bypass
Jeśli Full RELRO jest włączony, jedynym sposobem na obejście go jest znalezienie innej metody, która nie wymaga zapisu w tabeli GOT, aby uzyskać dowolne wykonanie.
Zauważ, że GOT LIBC jest zazwyczaj Partial RELRO, więc może być modyfikowany za pomocą dowolnego zapisu. Więcej informacji w Targetting libc GOT entries.
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.