Nauka reverse engineering.

0

Cześć. Nie przedłużając napiszę o co chodzi.
Ogólnie, zamierzam nauczyć się inżynierii odwrotnej. Myślę, że do tego najlepszy będzie język C, choć jak się mylę to proszę o poprawę.
Więc, jeżeli macie jakieś ciekawe materiały do ich nauki, czy jakieś rady to proszę o pomoc. Dodam, że umiem ogólne podstawy C++.
Z góry dziękuję.

3

Jesli masz jakies pojecie o assemblerze to mozesz zaczac od poczytania opracowan do jednej z pracownii na CMU

http://zpalexander.com/binary-bomb-lab-phase-1/

1

A po co Ci taka wiedza hmmm? :D

2

najpierw się martw, by być BARDZO DOBRYM w C/C++, wróć za kilka lat z pytaniem.

5

Uczę się RE pewnie ponad rok z przerwami więc się wypowiem. Oczywiście żaden ze mnie ekspert, ale może skorzystasz z moich rad.

AnyKtokolwiek napisał(a):

najpierw się martw, by być BARDZO DOBRYM w C/C++, wróć za kilka lat z pytaniem.

Z tym nie mogę się zgodzić. Jak patrzę na wpisy niektórych ludzi tutaj w kategorii C/C++ to jestem pełen podziwu dla ich wiedzy i sam się dowiaduję coraz to nowszych rzeczy. Natomiast uczę się samego IT około trzech lat i nie uważam, żeby do RE trzeba było znać C/C++ na bardzo dobrym poziomie, bo sam znam C na poziomie dobrym, (choć moja ocena własnych umiejętności zapewne jest dużo zawyżona) a C++ dopiero się uczę. C++ uczę się teraz, ponieważ jest to połączenie low-level (w jakimś stopniu) i GUI z przyjaznym frameworkiem co służy przy tworzeniu narzędzi przydatnych właśnie w RE. Więc jakoś sobie radzę z inżynierią wsteczną i w środowisku niskiego poziomu czuję się coraz bardziej swobodnie nie znając bardzo dobrze ani C ani C++.

@KHX jeśli chcesz nauczyć się RE to musisz wziąć się za Asma - to logiczne, ponieważ zakładając, że nie masz dostępu do kodu źródłowego jedynym punktem zaczepienia jest kod maszynowy. Kod maszynowy jest przetwarzany przez jakiś tam Disassembler typu IDA i taki tool wypluwa Ci kod w dialekcie Asma. Z tym, że żeby móc odnaleźć się w większych projektach musisz umieć przekształcać Asma do C. Ktoś mógłby napisać, że Ghidra potrafi z kodu maszynowego przejść do kodu w C, ale jeśli nie rozumiesz pewnego fragmentu lub musisz się skupić na szczegółach programu, żeby przypuśćmy znaleźć lukę bezpieczeństwa to warto zerknąć wtedy na fragment tego pliku, ale w Asmie. Książka, która tłumaczy jak rozpoznawać struktury kodu C w języku Asma to https://beginners.re/. Przerobiłem ją od deski do deski i wtedy poczułem, że rzeczywiście coś tam klikać potrafię w to RE. Od tego bym zaczął na Twoim miejscu.

RE łączy się też z wszelkimi internalsami OS'ów, plików wykonywalnych, bibliotek i ogólnie tego jak działa komputer "pod maską". Do tego przydatna jest ta lektura przykładowo -> https://www.amazon.com/Practical-Reverse-Engineering-Reversing-Obfuscation/dp/1118787315 choć jest dość skomplikowana na początek. W mojej biblioteczce znajduje się też https://ksiegarnia.pwn.pl/Praktyczna-inzynieria-wsteczna,622427233,p.html choć jeszcze nie zacząłem jej przerabiać. Czytaj dużo o tym jak działa interesujący Cię system operacyjny przy czym powinny Cię interesować przede wszystkim takie rzeczy jak procesy, wątki, zarządzanie pamięcią. Pisz sobie programy w C na przykład w https://godbolt.org/ i studiuj kod maszynowy.

Oczywiście najważniejsza w inżynierii wstecznej jest praktyka i trzeba sobie uświadomić, że przeprowadzenie całościowej inżynierii wstecznej danego oprogramowania wymaga wiele czasu. Ten filmik też może Ci się przydać ->

No i to by było chyba na tyle. :) Możesz też zerknąć na mojego bloga https://shizz3r.blogspot.com/ i zobaczyć jak wygląda mój proces uczenia się RE. Jeśli zdecydujesz się poczytać tam co nieco to nie traktuj tego jak wpisów eksperckich, bo na ten moment jedynie przedstawiam tam swój proces nauki "from zero to hero" (no i ekspert ze mnie żaden) :) Jeszcze CTFy są warte uwagi - możesz spróbować sił w picoctf, czyli konkursie dla początkujących.

3
AnyKtokolwiek napisał(a):

najpierw się martw, by być BARDZO DOBRYM w C/C++, wróć za kilka lat z pytaniem.

C++ jest dla zboczeńców. C zaś spokojnie można opanować w sferze konstruktów języka na zaawansowanym poziomie w rok. Zbytnio się nie śpiesząc. Wiem bo piszę w nim już jakieś 12 lat, w tym kod kernelowy.

Więcej uwagi warto raczej poświęcić danej platformie sprzętowej (rozumienie jak działa i ogarnianie instrukcji procesora, koprocesora i czego tam jeszcze inżynierowie dali) i systemowi operacyjnemu czy maszynie wirtualnej - zależnie na jakim poziomie ma być ten reverse engineering robiony.

4

Dobra widzę że sporo się wywiązało jałowej dyskusji czego i w jakiej kolejności się uczyć.

Jeśli chcesz robić reverse engineering - to masz jakiś przedmiot dociekań i chcesz dojść jak działa. Będzie to tym prostsze im więcej wiesz o dziedzinie w której funkcjonuje, o jego elementach składowych, typowych praktykach konstrukcji tego przedmiotu, oraz jak "rozgryziono" zbliżone rzeczy.

Jeśli masz płytę drukowaną - to analizujesz co ma wlutowane i jak i z czym jest to połączone. Jakie ma chipy - dochodząc przykładowo do ich dokumentacji. Jeśli ma to jakiś mikroprocesor i wlutowaną pamięć - to dobierasz się do zapisanych w niej danych i ciśniesz ile jesteś w stanie analizy bajt po bajcie - zaczynając np. od wiedzy że dany mikroprocesor odczytuje tuż po dostarczeniu mu zasilania instrukcje spod konkretnego adresu w pamięci np. 0x00000000. Więc sprawdzasz co się spod tego adresu ładuje.

Jeśli masz jakiś program np. dla Commodore 64 (stosunkowo krótkie programy z racji ograniczeń sprzętu, do tego często pisane od razu w assemblerze co eliminuje wiele zabawy w porównaniu z np. C gdzie czasem trzeba się bawić w dochodzenie "co kompilator miał na myśli") to robisz deasemblację (np. "na zimno" poza maszyną i systemem operacyjnym, żeby ominąć jakieś magiczne haki sabotujące próby analizy uruchomionego programu, jakie kiedyś stosowano i które cię oszukiwały jeśli próbowałeś "na żywo" działający program uruchamiać "krokowo") i instrukcja po instrukcji analizujesz co się dzieje.

Jeśli chcesz rozgryźć jakiś filtr graficzny/szyfrowanie/metodę syntezy dźwięku - to przydaje się sporo matematyki i wiedzy z metod numerycznych.

Jeśli chcesz uzyskać większą kontrolę nad jakąś kamerą IP, routerem czy podobnymi rzeczami które są na tyle "duże" że mają MMU i chodzi na nich np. jakaś dystrybucja Linuksa to typowo zaczynasz od znalezienia portu UART i się pod niego podpinasz. Potem lecisz analizę co za soft ma zainstalowany, jeśli uzyskasz na UART połączenie z np.konsolą najlepiej na prawach roota. Innym sposobem może być znalezienie jakiegoś exploitu na swój router czy kameę IP i wbicie tą drogą.

Temat rzeka. Myśl o tym jak o rozebraniu czegoś - im więcej będziesz wiedział o częściach, tym bardziej jasne będzie dla ciebie jak coś działa i mniej wysiłku pochłonie. Czasem te części będą kodem, czasem elektroniką, czasem algorytmem obliczania czegoś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1