Member, Team, Ops && Sec Stuff, IoT, RE

Bezpieczeństwo IT ~ IoT, ARM, MIPS i inne

ARM Assembly Exploitation - Part 2

@hesterhawk01 ♘ 12 marca, 2019

Na samym początku nie było tak kolorowo jak w publikacji Aditya Gupty. Podczas researchu natknąłem się na problemy, na które nie znalazłem jednoznacznego rozwiązania ani przyczyny ich wystąpienia w środowisku jakiego używam.

Nieprawidłowe parametry

W payloadzie umieściłem adres ciągu "/bin/bash" (0xbeffff34) zamiast "/bin/sh" co po uruchomieniu eksploitu skutkowało błędem "Segmentation Fault".

Chciałem rozwiązać ten problem zmieniając skok z funkcji "system", do funkcji "execve" zamiast w pierwszej kolejności zajrzeć do manuala, co był trochę bezmyślne. Exploit znowu nie zadziałał. Tu w tym miejscu muszę przyznać się bez bicia, że nie analizowałem czemu właśnie parametr "/bin/bash" stanowi w tym kontekście aż taki problem. Chcąc to jakoś obejść zmieniłem trochę kierunek brnąc w temat dalej, i tutaj pojawiła się mała ciekawostka ;)

Funkcja “execve ”przyjmuje trzy parametry:

int execve(const char *filename, char *const argv[], char *const envp[]);

W architekturze ARM argumenty funkcji pobierane są z rejestrów - w naszym przypadku - R0, R1, R2. Czytając poprzedni artykuł możesz zaobserwować, że rejestr R2 wypełniany jest wartością "1" (zobacz obrazek nad tagiem: #dziwnytenR2) i to stanowi problem podzas eksploitacji programu.

Jeśli teraz uruchomisz gdb, zrobisz brejka przed skokiem do funkcji "execve" i zamienisz wartość rejestru R2 z 1 na 0, to exploit zadziała. Podobny problem występuje też przy wspomnianej funkcji "execl". Teraz jest pytanie, jak to obejść poza debuggerem. Da się. Możesz pokombinować samemu tak dla sportu i podzielić się swoim rozwiązaniem, jeśli jednak jesteś ciekawy jak to obejść - zapraszam Cię na rundę 3 już niebawem :)

FAQ

Czyli odpowiedzi na pytania, które mogły się nasunąć podczas researchu.

Nie rozumiem/jak zacząć

https://azeria-labs.com - masa mega wartościowej wiedzy przedstawionej w bardzo przystępny sposób. Jeśli siedzisz w tematach: ARM pod kątem security (reverse engineering, jak działa stos, sterta itp), środowisko pracy (gdb, gef, vm, itp.), albo dopiero zaczynasz - polecam Ci tą całą stronę.

Jeśli dopiero zaczynasz - zacznij od tutoriala na samym dole tej strony.

Dodatkowo znajdziesz tam wiedzę z zakresu - jak optymalnie podejść do nauki rzeczy, które Cię interesują. Nie musisz także posiadać swojego Raspberry PI - na stronie znajdziesz obrazy na VM do swoich testów!

https://blog.attify.com/demystifying-ret2zp - publikacja, na której się opierałem. Znajdziesz w niej dodatkowo opis ataku dla architektóry Intel.

Google, czas, mózg i chęci - bardzo ważne i przydatne narzędzia do eksperymentowania

Jak obliczyć długość payloadu

Sekcja P1 rundy 1, pierwszy obrazek - jak obliczyłem, że payload rozpoczyna się od 68 znaków 'A'? Polecałbym Tobie zaznajomienie się z chociażby tym narzędziem, które jest mega pomocne w obliczaniu offsetów.

Mowa końcowa

Zachęcam Cię do własnych eksperymentów z tematem a jeszcze bardziej do pogłębiania wiedzy z zakresu technologii ARM (na przykład czytając manuala do poduszki ;)

Będziemy bardzo wdzięczni za każdy konstruktywny feedback.

---
research - Mateusz Wójcik <@hesterhawk01>

Similis simili gaudet