# Narzędzia do odwracania i podstawowe metody
Dowiedz się, jak hakować AWS od zera do bohatera zhtARTE (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**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) **i** [**HackTricks Cloud**](https://github.com/carlospolop/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**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) 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](https://github.com/zer0condition/ReverseKit)
## Dekompilator Wasm / Kompilator Wat
Online:
* Użyj [https://webassembly.github.io/wabt/demo/wasm2wat/index.html](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/](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/](https://wwwg.github.io/web-wasmdec/) do dekompilacji
Oprogramowanie:
* [https://www.pnfsoftware.com/jeb/demo](https://www.pnfsoftware.com/jeb/demo)
* [https://github.com/wwwg/wasmdec](https://github.com/wwwg/wasmdec)
## Dekompilator .Net
### [dotPeek](https://www.jetbrains.com/decompiler/)
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](https://www.red-gate.com/products/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](https://github.com/icsharpcode/ILSpy) & [dnSpy](https://github.com/dnSpy/dnSpy/releases)
[Plugin ILSpy dla Visual Studio Code](https://github.com/icsharpcode/ilspy-vscode): 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**](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/](https://www.jetbrains.com/es-es/decompiler/)
### Rejestrowanie DNSpy
Aby **DNSpy zarejestrował pewne informacje w pliku**, można użyć tych linii .Net:
```bash
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**:
![](<../../.gitbook/assets/image (278).png>)
```aspnet
[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**:
![](<../../.gitbook/assets/image (314) (1) (1).png>)
Następnie zapisz nowy plik w _**Plik >> Zapisz moduł...**_:
![](<../../.gitbook/assets/image (279).png>)
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...**:
![](<../../.gitbook/assets/image (280).png>)
Następnie wybierz **w3wp.exe**, aby dołączyć do serwera **IIS**, a następnie kliknij **dołącz**:
![](<../../.gitbook/assets/image (281).png>)
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**_:
![](<../../.gitbook/assets/image (286).png>)
![](<../../.gitbook/assets/image (283).png>)
Kliknij dowolny moduł na **Modułach** i wybierz **Otwórz wszystkie moduły**:
![](<../../.gitbook/assets/image (284).png>)
Kliknij prawym przyciskiem myszy dowolny moduł w **Eksploratorze zestawów** i kliknij **Sortuj zestawy**:
![](<../../.gitbook/assets/image (285).png>)
## Dekompilator Java
[https://github.com/skylot/jadx](https://github.com/skylot/jadx)\
[https://github.com/java-decompiler/jd-gui/releases](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**"
![](<../../.gitbook/assets/image (135).png>)
* Skonfiguruj **parametry** wykonania, podając **ścieżkę do DLL** i funkcję, którą chcesz wywołać:
![](<../../.gitbook/assets/image (136).png>)
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**:
![](<../../.gitbook/assets/image (137).png>)
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**](https://www.cheatengine.org/downloads.php) 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](cheat-engine.md)
{% endcontent-ref %}
## ARM i MIPS
{% embed url="https://github.com/nongiach/arm_now" %}
## Shellkody
### Debugowanie shellkodu za pomocą blobrunner
[**Blobrunner**](https://github.com/OALabs/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](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](blobrunner.md)
{% endcontent-ref %}
### Debugowanie shellkodu za pomocą jmp2it
[**jmp2it** ](https://github.com/adamkramer/jmp2it/releases/tag/v1.4)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.
![](<../../.gitbook/assets/image (397).png>)
Możesz pobrać skompilowaną wersję [jmp2it na stronie wydań](https://github.com/adamkramer/jmp2it/releases/).
### Debugowanie shellkodu za pomocą Cutter
[**Cutter**](https://github.com/rizinorg/cutter/releases/tag/v1.12.0) 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ł:
![](<../../.gitbook/assets/image (400).png>)
Aby rozpocząć emulację w wybranym miejscu, ustaw tam punkt przerwania, a Cutter automatycznie rozpocznie emulację od tego miejsca:
![](<../../.gitbook/assets/image (399).png>)
Możesz na przykład zobaczyć stos w postaci wydruku szesnastkowego:
![](<../../.gitbook/assets/image (402).png>)
### Deobfuskacja shellkodu i uzyskiwanie wykonywanych funkcji
Powinieneś spróbować [**scdbg**](http://sandsprite.com/blogs/index.php?uid=7\&pid=152).\
Powiedzą ci, jakie funkcje używa shellkod i czy shellkod dekoduje się w pamięci.
```bash
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.
![](<../../.gitbook/assets/image (398).png>)
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)](https://gchq.github.io/CyberChef/#recipe=To\_Hex\('Space',0\)Disassemble\_x86\('32','Full%20x86%20architecture',16,0,true,true\))
## [Movfuscator](https://github.com/xoreaxeaxeax/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://www.youtube.com/watch?v=2VF\_wPkiBJY)
* [https://github.com/xoreaxeaxeax/movfuscator/blob/master/slides/domas\_2015\_the\_movfuscator.pdf](https://github.com/xoreaxeaxeax/movfuscator/blob/master/slides/domas\_2015\_the\_movfuscator.pdf)
Jeśli masz szczęście, [demovfuscator](https://github.com/kirschju/demovfuscator) zdeobfuskuje plik binarny. Ma kilka zależności.
```
apt-get install libcapstone-dev
apt-get install libz3-dev
```
I [zainstaluj keystone](https://github.com/keystone-engine/keystone/blob/master/docs/COMPILE-NIX.md) (`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](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**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) 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:
![](<../../.gitbook/assets/image (612).png>)
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](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](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](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](../../forensics/basic-forensic-methodology/specific-software-file-type-tricks/.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**](https://problemkaputt.de/gba.htm) (_Pobierz wersję debugowania_) - Zawiera debugger z interfejsem
* [**mgba** ](https://mgba.io)- Zawiera debugger CLI
* [**gba-ghidra-loader**](https://github.com/pudii/gba-ghidra-loader) - Wtyczka Ghidra
* [**GhidraGBA**](https://github.com/SiD3W4y/GhidraGBA) - Wtyczka Ghidra
W [**no$gba**](https://problemkaputt.de/gba.htm), w _**Options --> Emulation Setup --> Controls**_\*\* \*\* możesz zobaczyć, jak naciskać przyciski Game Boy Advance
![](<../../.gitbook/assets/image (578).png>)
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**.
![](<../../.gitbook/assets/image (579).png>)
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):
```c
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:
```c
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`**).
```c
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 zmienna `cont` 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/**](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/0xZ0F/Z0FCourse\_ReverseEngineering)
* [https://github.com/malrev/ABD](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**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) już dziś.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Naucz się hakować AWS od zera do bohatera zhtARTE (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**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.