25 KiB
Narzędzia do odwracania i podstawowe metody
Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź SUBSCRIPTION PLANS!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów GitHub.
Znajdź najważniejsze podatności, aby móc je szybko naprawić. Intruder śledzi powierzchnię ataku, wykonuje proaktywne skanowanie zagrożeń, znajduje problemy w całym stosie technologicznym, od interfejsów API po aplikacje internetowe i systemy chmurowe. Wypróbuj go za darmo już dziś.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Narzędzia do odwracania oparte na ImGui
Oprogramowanie:
- ReverseKit: https://github.com/zer0condition/ReverseKit
Dekompilator Wasm / Kompilator Wat
Online:
- Użyj https://webassembly.github.io/wabt/demo/wasm2wat/index.html, aby odkompilować z formatu wasm (binarnego) do formatu wat (czysty tekst)
- Użyj https://webassembly.github.io/wabt/demo/wat2wasm/, aby skompilować z formatu wat do formatu wasm
- Możesz również spróbować użyć https://wwwg.github.io/web-wasmdec/ do dekompilacji
Oprogramowanie:
Dekompilator .Net
dotPeek
dotPeek to dekompilator, który dekompiluje i analizuje wiele formatów, w tym biblioteki (.dll), pliki metadanych systemu Windows (.winmd) i pliki wykonywalne (.exe). Po dekompilacji, zestaw można zapisać jako projekt Visual Studio (.csproj).
Zaletą jest to, że jeśli utracony kod źródłowy wymaga przywrócenia z archiwalnego zestawu, ta czynność może zaoszczędzić czas. Ponadto, dotPeek zapewnia wygodną nawigację po dekompilowanym kodzie, co czyni go jednym z doskonałych narzędzi do analizy algorytmów Xamarin.
.Net Reflector
Dzięki wszechstronnemu modelowi dodatków i interfejsowi API, który rozszerza narzędzie, aby dostosować je do Twoich dokładnych potrzeb, .NET reflector oszczędza czas i upraszcza rozwój. Przyjrzyjmy się mnogości usług inżynierii wstecz, które oferuje to narzędzie:
- Zapewnia wgląd w sposób przepływu danych przez bibliotekę lub komponent
- Zapewnia wgląd w implementację i użycie języków i frameworków .NET
- Znajduje funkcjonalności nieudokumentowane i nieujawnione, aby uzyskać więcej z wykorzystywanych interfejsów API i technologii.
- Znajduje zależności i różne zestawy
- Namierza dokładne położenie błędów w Twoim kodzie, komponentach i bibliotekach innych firm.
- Debuguje kod źródłowy wszystkich kodów .NET, z którymi pracujesz.
ILSpy & dnSpy
Plugin ILSpy dla Visual Studio Code: Możesz go mieć na dowolnym systemie operacyjnym (możesz zainstalować go bezpośrednio z VSCode, nie trzeba pobierać git. Kliknij Extensions i search ILSpy).
Jeśli potrzebujesz dekompilować, modyfikować i ponownie skompilować, możesz użyć: https://github.com/0xd4d/dnSpy/releases (Right Click -> Modify Method aby zmienić coś wewnątrz funkcji).
Możesz również spróbować https://www.jetbrains.com/es-es/decompiler/
Rejestrowanie DNSpy
Aby DNSpy zarejestrował pewne informacje w pliku, można użyć tych linii .Net:
using System.IO;
path = "C:\\inetpub\\temp\\MyTest2.txt";
File.AppendAllText(path, "Password: " + password + "\n");
Debugowanie za pomocą DNSpy
Aby debugować kod za pomocą DNSpy, musisz:
Po pierwsze, zmień atrybuty zestawu związane z debugowaniem:
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
Do:
Narzędzia do odwracania kodu - podstawowe metody
Wstęp
W procesie odwracania kodu, czyli analizy i zrozumienia działania programu, istnieje wiele narzędzi, które mogą pomóc w tym zadaniu. Poniżej przedstawiamy kilka podstawowych metod i narzędzi, które warto znać.
Metoda 1: Disassemblery
Disassembler to narzędzie, które przekształca kod maszynowy na kod zrozumiały dla człowieka. Pozwala to na analizę i zrozumienie działania programu na poziomie niższym niż kod źródłowy. Przykładowymi popularnymi disassemblerami są IDA Pro, Ghidra i radare2.
Metoda 2: Debugger
Debugger to narzędzie, które umożliwia analizę działania programu w czasie rzeczywistym. Pozwala na zatrzymywanie programu w określonych punktach, obserwowanie wartości zmiennych i śledzenie wykonywanych instrukcji. Przykładami popularnych debuggerów są GDB, OllyDbg i x64dbg.
Metoda 3: Decompiler
Decompiler to narzędzie, które przekształca kod skompilowany na kod źródłowy w języku wysokiego poziomu. Choć decompiler nie zawsze jest w stanie odtworzyć dokładny kod źródłowy, może dostarczyć przydatnych wskazówek dotyczących działania programu. Przykładami popularnych decompilerów są IDA Pro, Ghidra i RetDec.
Metoda 4: Static Analysis Tools
Narzędzia do statycznej analizy kodu pozwalają na automatyczną analizę programu bez jego uruchamiania. Mogą one wykrywać podatności, nieprawidłowe wywołania funkcji i inne potencjalne problemy. Przykładami popularnych narzędzi do statycznej analizy kodu są SonarQube, FindBugs i PMD.
Metoda 5: Dynamic Analysis Tools
Narzędzia do dynamicznej analizy kodu pozwalają na analizę programu w czasie jego działania. Mogą one monitorować wywołania funkcji, śledzić wartości zmiennych i wykrywać nieprawidłowe zachowanie. Przykładami popularnych narzędzi do dynamicznej analizy kodu są Wireshark, Fiddler i Burp Suite.
Podsumowanie
Wyżej wymienione metody i narzędzia stanowią podstawę dla procesu odwracania kodu. Wybór odpowiednich narzędzi zależy od konkretnego przypadku i wymagań. Ważne jest również posiadanie umiejętności analizy i zrozumienia kodu maszynowego oraz kodu źródłowego.
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default |
DebuggableAttribute.DebuggingModes.DisableOptimizations |
DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints |
DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
I kliknij kompiluj:
Następnie zapisz nowy plik w Plik >> Zapisz moduł...:
Jest to konieczne, ponieważ jeśli tego nie zrobisz, podczas uruchamiania kodu zostanie zastosowanych wiele optymalizacji, co może spowodować, że podczas debugowania punkt przerwania nie zostanie osiągnięty lub niektóre zmienne nie będą istnieć.
Następnie, jeśli twoja aplikacja .Net jest uruchamiana przez IIS, możesz ją ponownie uruchomić za pomocą:
iisreset /noforce
Następnie, aby rozpocząć debugowanie, należy zamknąć wszystkie otwarte pliki i w zakładce Debugowanie wybrać Dołącz do procesu...:
Następnie wybierz w3wp.exe, aby dołączyć do serwera IIS, a następnie kliknij dołącz:
Teraz, gdy debugujemy proces, należy go zatrzymać i załadować wszystkie moduły. Najpierw kliknij Debugowanie >> Zatrzymaj wszystko, a następnie kliknij Debugowanie >> Okna >> Moduły:
Kliknij dowolny moduł na Modułach i wybierz Otwórz wszystkie moduły:
Kliknij prawym przyciskiem myszy dowolny moduł w Eksploratorze zestawów i kliknij Sortuj zestawy:
Dekompilator Java
https://github.com/skylot/jadx
https://github.com/java-decompiler/jd-gui/releases
Debugowanie DLL
Za pomocą IDA
- Załaduj rundll32 (64 bity w C:\Windows\System32\rundll32.exe i 32 bity w C:\Windows\SysWOW64\rundll32.exe)
- Wybierz debuger Windbg
- Wybierz "Zawieś przy ładowaniu/odładowywaniu biblioteki"
- Skonfiguruj parametry wykonania, podając ścieżkę do DLL i funkcję, którą chcesz wywołać:
Następnie, gdy rozpoczynasz debugowanie, wykonanie zostanie zatrzymane po załadowaniu każdej DLL, a gdy rundll32 załaduje twoją DLL, wykonanie zostanie zatrzymane.
Ale jak można uzyskać dostęp do kodu załadowanej DLL? Nie wiem, jak to zrobić za pomocą tej metody.
Za pomocą x64dbg/x32dbg
- Załaduj rundll32 (64 bity w C:\Windows\System32\rundll32.exe i 32 bity w C:\Windows\SysWOW64\rundll32.exe)
- Zmień wiersz polecenia ( Plik --> Zmień wiersz polecenia ) i ustaw ścieżkę do DLL oraz funkcję, którą chcesz wywołać, na przykład: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\14.ridii_2.dll",DLLMain
- Zmień Opcje --> Ustawienia i wybierz "Wejście DLL".
- Następnie uruchom wykonanie, debugger zatrzyma się przy każdym głównym pliku DLL, w pewnym momencie zatrzymasz się w wejściu DLL twojej DLL. Stamtąd wyszukaj miejsca, w których chcesz ustawić punkt przerwania.
Zauważ, że gdy wykonanie zostanie zatrzymane z jakiegokolwiek powodu w win64dbg, możesz zobaczyć w jakim kodzie się znajdujesz, patrząc na górę okna win64dbg:
Następnie, patrząc na to, możesz zobaczyć, kiedy wykonanie zostało zatrzymane w żądanej DLL do debugowania.
Aplikacje GUI / Gry wideo
Cheat Engine to przydatny program do znajdowania ważnych wartości zapisanych w pamięci działającej gry i ich zmiany. Więcej informacji znajduje się w:
{% content-ref url="cheat-engine.md" %} cheat-engine.md {% endcontent-ref %}
ARM i MIPS
{% embed url="https://github.com/nongiach/arm_now" %}
Shellkody
Debugowanie shellkodu za pomocą blobrunner
Blobrunner zaalokuje shellkod w przestrzeni pamięci, wskaże adres pamięci, w którym shellkod został zaalokowany, a następnie zatrzyma wykonanie.
Następnie musisz dołączyć debugger (Ida lub x64dbg) do procesu i ustawić punkt przerwania na wskazanym adresie pamięci, a następnie wznowić wykonanie. W ten sposób będziesz debugować shellkod.
Na stronie wydań GitHub znajdują się paczki zawierające skompilowane wersje: https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5
Możesz znaleźć nieco zmodyfikowaną wersję Blobrunner pod poniższym linkiem. Aby ją skompilować, wystarczy utworzyć projekt C/C++ w Visual Studio Code, skopiować i wkleić kod oraz go zbudować.
{% content-ref url="blobrunner.md" %} blobrunner.md {% endcontent-ref %}
Debugowanie shellkodu za pomocą jmp2it
jmp2it jest bardzo podobny do blobrunner. Zaalokuje shellkod w przestrzeni pamięci i uruchomi wieczną pętlę. Następnie musisz dołączyć debugger do procesu, rozpocząć wykonanie, poczekać 2-5 sekund i nacisnąć stop, a znajdziesz się w wiecznej pętli. Przejdź do następnej instrukcji wiecznej pętli, ponieważ będzie to wywołanie shellkodu, a na koniec będziesz wykonywać shellkod.
Możesz pobrać skompilowaną wersję jmp2it na stronie wydań.
Debugowanie shellkodu za pomocą Cutter
Cutter to interfejs graficzny radare. Za pomocą Cuttera możesz emulować shellkod i dynamicznie go analizować.
Należy zauważyć, że Cutter pozwala na "Otwarcie pliku" i "Otwarcie shellkodu". W moim przypadku, gdy otworzyłem shellkod jako plik, został on poprawnie zdekompilowany, ale gdy otworzyłem go jako shellkod, nie został:
Aby rozpocząć emulację w wybranym miejscu, ustaw tam punkt przerwania, a Cutter automatycznie rozpocznie emulację od tego miejsca:
Możesz na przykład zobaczyć stos w postaci wydruku szesnastkowego:
Deobfuskacja shellkodu i uzyskiwanie wykonywanych funkcji
Powinieneś spróbować scdbg.
Powiedzą ci, jakie funkcje używa shellkod i czy shellkod dekoduje się w pamięci.
scdbg.exe -f shellcode # Get info
scdbg.exe -f shellcode -r #show analysis report at end of run
scdbg.exe -f shellcode -i -r #enable interactive hooks (file and network) and show analysis report at end of run
scdbg.exe -f shellcode -d #Dump decoded shellcode
scdbg.exe -f shellcode /findsc #Find offset where starts
scdbg.exe -f shellcode /foff 0x0000004D #Start the executing in that offset
scDbg posiada również graficzny launcher, w którym można wybrać opcje i uruchomić shellcode.
Opcja Create Dump spowoduje zrzut końcowego shellcode, jeśli w pamięci zostanie dokonana jakakolwiek zmiana w shellcode (przydatne do pobrania zdekodowanego shellcode). Start offset może być przydatny do uruchomienia shellcode na określonym przesunięciu. Opcja Debug Shell jest przydatna do debugowania shellcode za pomocą terminala scDbg (jednak uważam, że każda z wcześniej opisanych opcji jest lepsza w tej kwestii, ponieważ można użyć Ida lub x64dbg).
Dezasemblowanie za pomocą CyberChef
Prześlij plik shellcode jako dane wejściowe i użyj następującego przepisu, aby go zdekompilować: https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)
Movfuscator
Ten obfuskator modyfikuje wszystkie instrukcje dla mov
(tak, naprawdę fajne). Wykorzystuje również przerwania do zmiany przepływów wykonania. Aby uzyskać więcej informacji na temat jego działania:
- https://www.youtube.com/watch?v=2VF_wPkiBJY
- https://github.com/xoreaxeaxeax/movfuscator/blob/master/slides/domas_2015_the_movfuscator.pdf
Jeśli masz szczęście, demovfuscator zdeobfuskuje plik binarny. Ma kilka zależności.
apt-get install libcapstone-dev
apt-get install libz3-dev
I zainstaluj keystone (apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install
)
Jeśli grasz w CTF, ta metoda znajdowania flagi może być bardzo przydatna: https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html
Znajdź najważniejsze podatności, aby szybko je naprawić. Intruder śledzi twoją powierzchnię ataku, wykonuje proaktywne skanowanie zagrożeń, znajduje problemy w całym stosie technologicznym, od interfejsów API po aplikacje internetowe i systemy chmurowe. Wypróbuj go za darmo już dziś.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Rust
Aby znaleźć punkt wejścia, wyszukaj funkcje za pomocą ::main
, jak w:
W tym przypadku plik binarny nazywał się authenticator, więc jest dość oczywiste, że to jest interesująca funkcja główna.
Mając nazwę wywoływanych funkcji, wyszukaj je w Internecie, aby dowiedzieć się o ich wejściach i wyjściach.
Delphi
Dla skompilowanych plików binarnych Delphi można użyć https://github.com/crypto2011/IDR
Jeśli musisz odwrócić binarny plik Delphi, polecam skorzystanie z wtyczki IDA https://github.com/Coldzer0/IDA-For-Delphi
Wciśnij po prostu ATL+f7 (zaimportuj wtyczkę python w IDA) i wybierz wtyczkę python.
Ta wtyczka uruchomi binarny plik i dynamicznie rozwiąże nazwy funkcji na początku debugowania. Po rozpoczęciu debugowania ponownie naciśnij przycisk Start (zielony lub f9), a przerwa zostanie zatrzymana na początku rzeczywistego kodu.
Jest to również bardzo interesujące, ponieważ jeśli naciśniesz przycisk w aplikacji graficznej, debugger zatrzyma się w funkcji wykonywanej przez ten przycisk.
Golang
Jeśli musisz odwrócić binarny plik Golang, polecam skorzystanie z wtyczki IDA https://github.com/sibears/IDAGolangHelper
Wciśnij po prostu ATL+f7 (zaimportuj wtyczkę python w IDA) i wybierz wtyczkę python.
To rozwiąże nazwy funkcji.
Skompilowany Python
Na tej stronie znajdziesz, jak uzyskać kod pythona z binarnego pliku ELF/EXE skompilowanego w Pythonie:
{% content-ref url="../../forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md" %} .pyc.md {% endcontent-ref %}
GBA - Game Body Advance
Jeśli masz binarny plik gry GBA, możesz użyć różnych narzędzi do emulacji i debugowania:
- no$gba (Pobierz wersję debugowania) - Zawiera debugger z interfejsem
- mgba - Zawiera debugger CLI
- gba-ghidra-loader - Wtyczka Ghidra
- GhidraGBA - Wtyczka Ghidra
W no$gba, w Options --> Emulation Setup --> Controls** ** możesz zobaczyć, jak naciskać przyciski Game Boy Advance
Po naciśnięciu każdy klawisz ma wartość, która go identyfikuje:
A = 1
B = 2
SELECT = 4
START = 8
RIGHT = 16
LEFT = 32
UP = 64
DOWN = 128
R = 256
L = 256
Więc, w tego rodzaju programach interesującą częścią będzie sposób, w jaki program traktuje dane wprowadzone przez użytkownika. W adresie 0x4000130 znajdziesz często spotykaną funkcję: KEYINPUT.
Na poprzednim obrazku możesz zobaczyć, że funkcja jest wywoływana z FUN_080015a8 (adresy: 0x080015fa i 0x080017ac).
W tej funkcji, po kilku operacjach inicjalizacyjnych (bez większego znaczenia):
void FUN_080015a8(void)
{
ushort uVar1;
undefined4 uVar2;
undefined4 uVar3;
ushort uVar4;
int iVar5;
ushort *puVar6;
undefined *local_2c;
DISPCNT = 0x1140;
FUN_08000a74();
FUN_08000ce4(1);
DISPCNT = 0x404;
FUN_08000dd0(&DAT_02009584,0x6000000,&DAT_030000dc);
FUN_08000354(&DAT_030000dc,0x3c);
uVar4 = DAT_030004d8;
Znaleziono ten kod:
do {
DAT_030004da = uVar4; //This is the last key pressed
DAT_030004d8 = KEYINPUT | 0xfc00;
puVar6 = &DAT_0200b03c;
uVar4 = DAT_030004d8;
do {
uVar2 = DAT_030004dc;
uVar1 = *puVar6;
if ((uVar1 & DAT_030004da & ~uVar4) != 0) {
Ostatnie if sprawdza, czy uVar4
znajduje się w ostatnich kluczach i nie jest to bieżący klucz, nazywany również puśczeniem przycisku (bieżący klucz jest przechowywany w uVar1
).
if (uVar1 == 4) {
DAT_030000d4 = 0;
uVar3 = FUN_08001c24(DAT_030004dc);
FUN_08001868(uVar2,0,uVar3);
DAT_05000000 = 0x1483;
FUN_08001844(&DAT_0200ba18);
FUN_08001844(&DAT_0200ba20,&DAT_0200ba40);
DAT_030000d8 = 0;
uVar4 = DAT_030004d8;
}
else {
if (uVar1 == 8) {
if (DAT_030000d8 == 0xf3) {
DISPCNT = 0x404;
FUN_08000dd0(&DAT_02008aac,0x6000000,&DAT_030000dc);
FUN_08000354(&DAT_030000dc,0x3c);
uVar4 = DAT_030004d8;
}
}
else {
if (DAT_030000d4 < 8) {
DAT_030000d4 = DAT_030000d4 + 1;
FUN_08000864();
if (uVar1 == 0x10) {
DAT_030000d8 = DAT_030000d8 + 0x3a;
W poprzednim kodzie można zobaczyć, że porównujemy uVar1 (miejsce, gdzie znajduje się wartość naciśniętego przycisku) z pewnymi wartościami:
- Po pierwsze, porównujemy go z wartością 4 (przycisk SELECT): W tym wyzwaniu ten przycisk czyści ekran.
- Następnie porównujemy go z wartością 8 (przycisk START): W tym wyzwaniu sprawdzane jest, czy kod jest poprawny, aby uzyskać flagę.
- W tym przypadku zmienna
DAT_030000d8
jest porównywana z 0xf3, a jeśli wartość jest taka sama, wykonuje się pewien kod. - W pozostałych przypadkach sprawdzane jest
DAT_030000d4
. Jest to zmienna, ponieważ po wprowadzeniu kodu dodawane jest 1.
Jeśli jest mniejsza niż 8, wykonywane są pewne operacje związane z dodawaniem wartości do **DAT_030000d8
** (w zasadzie dodawane są wartości naciśniętych klawiszy do tej zmiennej, dopóki zmiennacont
jest mniejsza niż 8).
W tym wyzwaniu, znając wartości przycisków, musisz nacisnąć kombinację o długości mniejszej niż 8, taką że suma dodawania wynosi 0xf3.
Odnośnik do tego samouczka: https://exp.codes/Nostalgia/
Game Boy
{% embed url="https://www.youtube.com/watch?v=VVbRe7wr3G4" %}
Kursy
- https://github.com/0xZ0F/Z0FCourse_ReverseEngineering
- https://github.com/malrev/ABD (Deobfuskacja binarna)
Znajduj podatności, które mają największe znaczenie, abyś mógł je szybko naprawić. Intruder śledzi twoją powierzchnię ataku, wykonuje proaktywne skanowanie zagrożeń, znajduje problemy w całym stosie technologicznym, od interfejsów API po aplikacje internetowe i systemy chmurowe. Wypróbuj go za darmo już dziś.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLAN SUBSKRYPCJI!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.