Inżynieria wsteczna z r2
Poziom: początkujący

radare2 (lub r2) to kompletne narzędzie to analizy wstecznej oprogramowania działające całkowicie w trybie tekstowym a jednocześnie wspierające wiele architektur oraz będące dostępne na wielu platformach. Dzięki temu sprawdza się wyśmienicie jeśli potrzebujemy narzędzia które będziemy mogli użyć zarówno na platformach Linux, macOS oraz Windows (i innych). Dodatkowo dostępne jest za darmo i rozwijane w modelu open-source. Nic tylko korzystać!

Instalacja

radare2 na wiele platform dostarczany jest jako paczka gotowa do zainstalowania, ale biorąc pod uwagę szybki rozwój pakietu (minimum kilkanaście commitów na dzień) jest to sposób niezalecany. Zdecydowanie lepiej pobrać źródła (sklonować) z repozytorium github i skompilować je we własnym zakresie. Na platformie macOS czy Linux jest to stosunkowo proste i sprowadza się do wykonania polecenia ./sys/install.sh które to automatycznie pobierze najnowszą wersję kodu i wykona jego kompilację. Poniżej widzimy fragment logu z takiego uruchomienia

➜  radare2 git:(master) ./sys/install.sh
WARNING: Updating from remote repository
WARNING: Updating from remote repository
remote: Enumerating objects: 267, done.
remote: Counting objects: 100% (267/267), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 327 (delta 248), reused 253 (delta 243), pack-reused 60
Receiving objects: 100% (327/327), 86.03 KiB | 12.29 MiB/s, done.
Resolving deltas: 100% (258/258), completed with 117 local objects.
From https://github.com/radare/radare2
84d714213..136db63c0 master -> origin/master

następnie po odczekaniu chwili będziemy mogli się cieszyć najnowszą wersją narzędzia. Na systemie Windows instalacja jest trochę bardziej skomplikowana, ale dostarczany opis jej przeprowadzenia powinien rozwiać wszelkie wątpliwości. Alternatywnie, możemy skorzystać z Windows Subsystem for Linux, zainstalować np. Ubuntu i zwyczajnie korzystać z radare tak jakbyśmy robili to na faktycznym systemie. 

Mając już zainstalowane narzędzie - zobaczmy co dostaliśmy.

Batman's utility belt

Choć radare2 jest głównym narzędziem z którego będziemy korzystać to przy instalacji dostajemy tak naprawdę zestaw narzędzi które możemy użyć do analizy aplikacji. Większość z nich to małe użyteczne programiki, które możemy uruchomić w celu ekstrakcji danych bez potrzeby zaprzęgania całego silnika analizy zawartego w radare2. Jeśli jednak od razu wiemy, że będziemy przeprowadzać dogłębną analizę - możemy je pominąć i przystąpić do uruchomienia r2 gdyż te same polecenia będziemy w stanie uruchomić z jego poziomu. Jakie to zatem narzędzia mamy dostępne w naszym orężu?

  • rabin2 - pozwala wyciągnąć specyficzne informacje odnośnie naszego celu inżynierii wstecznej takie jak punkt startowy, importy, etc. 
  • radiff2 - konsolowa porównywarka plików
  • ragg2 - pozwala zbudować przenośne shellcode’y
  • rahash2 - pozwala na szybkie wyliczenia skrótów za pomocą popularnych funkcji takich jak md5, sha, etc.
  • rasm2 - to konsolowy asembler oraz disassembler
  • rafind2 - umożliwia wyszukanie określonego ciągu bajtów w binarce
  • rarun2 - pozwala na skonfigurowanie odpowiedniego środowiska uruchomieniowego
  • rax2 - proste narzędzia do obliczania wyrażeń

Znając już nasze pełne oręże możemy przystąpić do zapoznania się z samym narzędziem radare2.
Wydajmy więc polecenie

  • r2 /bin/ls
  •  -- Don't do this.
  • [0x100001200]>

i już możemy zacząć analizować. 

Pierwsze zderzenie z r2 może być onieśmielające. Czarny ekran, znak zachęty poprzedzony jakimiś cyframi. Nie jest to najprzyjaźniejsze środowisko do pracy. I nie ma co tutaj oszukiwać, początki pracy z r2 nie należą do łatwych. Narzędzie posiada dość wysoki próg wejścia, który powoduje, że bardzo trudno jest zacząć z nim pracę, ale finalnie - gdy już poznamy podstawowy zestaw komend i poleceń nasza wydajność posługiwania się nim znacznie się zwiększy. Zobaczmy jak można zacząć pracę z radare2.

Trudne początki

Radare2 opiera się na poleceniach wprowadzanych po znaku zachęty. Jeśli po uruchomieniu narzędzia czujemy się zagubieni wystarczy wydać polecenie ? aby uzyskać pomoc. W zasadzie każde polecenie, którego nie znamy, można uzupełnić o znak zapytania i w rezultacie powinniśmy uzyskać pomoc na jego temat. 
Wiemy już zatem jak uzyskać pomoc ale jak zacząć? W wielu artykułach możemy znaleźć informację iż na samym początku warto wywołać aaa lub też aaaa (podążając tym tropem możemy trafić na jeden z easer-eggów, które są w programie zaszyte ;)). I choć jest to dobre rozwiązanie dla początkującego, gdyż wykona się całkowita analiza naszej aplikacji, to im bardziej wejdziemy w temat inżynierii wstecznej za pomocą radare2, będziemy chcieli sprecyzować jaką analizę chcemy wykonać gdyż ta kompletna czasem może zająć sporo czasu. Jak już się możemy domyślić analizie wykonywanej na naszym programie dokonamy za pomocą poleceń zaczynających się od litery a. I tak:
aaf - przeprowadzi analizę funkcji w binarce (functions)