.. _re1: ================================================ InĹźynieria wsteczna, czÄĹÄ 1 â analiza statyczna ================================================ Data: 05.11.2020, 10.11.2020 .. toctree:: .. contents:: NarzÄdzia ========= - GHIDRA: https://ghidra-sre.org/ (otwarty disassembler i dekompilator) - Python 3 .. _ghidra: ObsĹuga programu GHIDRA ----------------------- 1. Tworzymy nowy projekt 2. Importujemy program binarny (przycisk ``I``) 3. Otwieramy program binarny (podwĂłjnym klikniÄciem na plik w liĹcie plikĂłw) 4. Uruchamiamy automatycznÄ analizÄ (domyĹlne ustawienia powinny dziaĹaÄ) i czekamy na zakoĹczenie 5. PrzeglÄ damy kod, poprawiamy bĹÄdnie wywnioskowane informacje, dodajemy typy danych, nazywamy funkcje, ... NajwaĹźniejsze funkcje programu GHIDRA: - zmiana nazwy, parametrĂłw i typu zwracanego funkcji: klikamy w nazwÄ funkcji w panelu disassemblera (pierwsze wystÄ pienie nazwy â drugie nie dziaĹa) i naciskamy ``F`` - zmiana typu zmiennej lokalnej: klikamy w nazwÄ zmiennej lokalnej w panelu dekompilacji, naciskamy ``Ctrl-L`` - zmiana nazwy zmiennej lokalnej: jak wyĹźej, naciskamy ``L`` PrzykĹad 1: proste porĂłwnanie ============================= Program: :download:`simple` Zadanie: znaleĹşÄ poprawne hasĹo do programu. Jest kilka sposobĂłw rozwiÄ zania zadania: 1. Ĺadujemy do programu GHIDRA, czytamy funkcjÄ ``main`` 2. UĹźywamy polecenia ``strings`` i po prostu znajdujemy hasĹo ĹšrĂłdĹo: :download:`simple.c` PrzykĹad 2: prosty szyfr ======================== Program: :download:`encrypted` Zadanie: znaleĹşÄ poprawne hasĹo do programu. 1. Ĺadujemy do programu GHIDRA 2. Czytamy funkcjÄ ``main``, widzimy Ĺźe wĹaĹciwe sprawdzenie nastÄpuje znak po znaku w funkcji ``check`` 3. Czytamy i odwracamy funkcjÄ ``check`` ĹšrĂłdĹo: :download:`encrypted.c` PrzykĹad 3: obliczenia ====================== Program: :download:`key_checker` Zadanie: znaleĹşÄ poprawne hasĹo do programu. 1. Ĺadujemy do programu GHIDRA 2. Program nie ma symboli â znajdujemy i oznaczamy funkcjÄ ``main`` przez popatrzenie na punkt wejĹcia programu i wziÄcie pierwszego parametru do ``__libc_start_main`` 3. Zmieniamy nazwÄ zmiennej, do ktĂłrej ``scanf`` wczytuje hasĹo i poprawiamy jej typ na ``char[64]`` (GHIDRA nie radzie sobie z wykryciem rozmiaru sama) 4. Widzimy wywoĹania do trzech podfunkcji â pierwsza jest oczywista, druga wymaga odrobiny rÄcznej analizy 5. W trzeciej podfunkcji widzimy, Ĺźe wartoĹÄ zwracana nie ma sensu â poprawiamy to, ustawiajÄ c typ zwracany na ``bool`` 6. Pierwsze dwie funkcje odwracamy rÄcznie, do odwrĂłcenia trzeciej uĹźywamy np. Pythona 3 z bilbiotekÄ ``gmpy2``:: import gmpy2 print(int((gmpy2.invert(0x7b, 2**64) * -0x34306269e095bb9a) % 2 ** 64).to_bytes(8, 'little')) PrzykĹad 4: struktury ===================== Program: :download:`structures` Zadanie: znaleĹşÄ poprawne hasĹo do programu.