PL ARM – Return To Zero 2
Początek
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 😉