relog-pwnable

[RElog] Pwnable

Pseudo-writeup zadania „random”.

Witam Was w kolejnym (tym razem dość krótkim) RElogu, czyli luźnej serii powiązanej inżynierią wsteczną.  W tym wpisie chciałbym Wam pokazać serwis na którym można w dość przyjemny sposób rozwinąć swoje umiejętności „hakerskie”.

 

Pwn? Ctf?


W skrócie: [CTF] (capture the flag) to zadania/wyzwania polegające na znalezienie i odczytanie flagi.

Z kolei pwn oznacza przejęcie kontroli nad np innym komputerem, stroną, aplikacją, …  [Wiki].

Serwis Pwnable udostępnia zestaw zadań, które przypominają te z CTF’ów, ale są o wiele prostsze, dzięki czemu początkujący (w tym ja) mogą pobawić się w rozwiązywanie zadań tego typu samodzielnie. Po więcej informacji zapraszam na oficjalną stronę [Pwnable], gdzie można znaleźć m.in. regulamin.

 

Writeup


Chciałbym Wam przedstawić rozwiązanie chyba najprostszego zadania (nie chcę Wam psuć zabawy); wszystkie potrzebne informacje (dane do połączenia przez ssh) są podawane w treści zadania, podobnie sama treść niesie ze sobą małe wskazówki odnośnie tego gdzie należy szukać rozwiązania.

random (1pt)

Screenshot_2016-04-02_15-50-20

Jest to chyba najprostsze dostępne zadanie. Z jego nazwy możemy wywnioskować, że będzie dotyczyła losowości, a raczej pseudo-losowości funkcji rand(). Po zalogowaniu się przez ssh zobaczymy w głównym katalogu 3 pliki: flag, random.c, random. Flaga znajduje się w pliku flag jednak nie możemy go odczytać, bo nie mamy odpowiednich uprawnień. Jak łatwo możemy zauważyć, to może to zrobić program random (ma odpowiednia uprawnienia). Rzućmy okiem na jego kod źródłowy.

Jesteśmy w stanie zauważyć podstawowy błąd: funkcja rand() o ile nie ma ustawionego ziarna na podstawie np. czasu to sama z siebie przy każdym uruchomieniu programu zwróci zawsze identyczną wartość, dalej widzimy, że musimy podać jakąś liczbę typu uint, która następnie jest xor’owana z liczbą „losową” i wynik tej operacji musi zwrócić 0xdeadbeef.

Wiemy, że odwrotną operacją do xor jest xor, a więc jeżeli poznamy wartość pod zmienną random, to okazuje się że jedyną niewiadomą pozostaje klucz, który musimy podać, bo key^random=0xdeadbeef => random^0xdeadbeef=key. Jak widzimy po tej operacji powinniśmy móc odczytać flagę.

Zobaczmy co znajduje się pod zmienną random, do tego posłuży nam gdb.

Jak widzimy zmienna random ukrywa się pod [rbp-0x4], jeżeli ustawimy break point na np [0x0000000000400610], po czym uruchomimy program to powinniśmy móc odczytać wartość tej zmiennej:

Teraz możemy już zamknąć gdb i obliczyć klucz, który sprawi że program odczyta flagę, można to zrobić dość szybko np w interpreterze Pythona

Pozostało nam już teraz jedynie uruchomić program i podać wyliczony klucz po czym przekazać znalezioną flagę do pwnable aby uzyskać punkty za rozwiązanie zadania.

Screenshot_2016-04-02_16-21-09

Jak widzimy zadanie było bajecznie proste i nie wymagało specjalistycznej wiedzy, nie wymagało także zbytniego myślenia; zachęcam do spróbowania własnych sił na tym serwisie.

Materiały dodatkowe


  • [pwnable] – serwis przedstawiony w tym wpisie
  • [ctftime] – miejsce z informacjami o wszystkich ctf’ach
  • [Hacking, by Gyn] – artykuł zawierający informacje o hackingu oraz listę stron w stylu pwnable

Już w kolejnym RElogu porozmawiamy sobie o ukrywaniu danych i obfuskacji kodu maszynowego.

Code ON!