Reversing Tools & Basic Methods

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Red Team του HackTricks AWS)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Try Hard Security Group


Εργαλεία Αναστροφής Βασισμένα στο ImGui

Λογισμικό:

Wasm αποσυνταγματοποιητής / Μεταγλωττιστής Wat

Online:

Λογισμικό:

.NET αποσυνταγματοποιητής

Το dotPeek είναι ένας αποσυνταγματοποιητής που αποσυνταγματοποιεί και εξετάζει πολλές μορφές, συμπεριλαμβανομένων των βιβλιοθηκών (.dll), των αρχείων μεταδεδομένων των Windows (.winmd) και των εκτελέσιμων αρχείων (.exe). Αφού αποσυνταγματοποιηθεί, μια συναγωγή μπορεί να αποθηκευτεί ως ένα project του Visual Studio (.csproj).

Το πλεονέκτημα εδώ είναι ότι αν ένας χαμένος πηγαίος κώδικας απαιτεί ανάκτηση από μια παλαιότερη συναγωγή, αυτή η ενέργεια μπορεί να εξοικονομήσει χρόνο. Επιπλέον, το dotPeek παρέχει βολική πλοήγηση σε ολόκληρο τον αποσυνταγματοποιημένο κώδικα, κάνοντάς το ένα από τα ιδανικά εργαλεία για ανάλυση αλγορίθμων Xamarin.

Με ένα πλήρες μοντέλο πρόσθετων και μια API που επεκτείνει το εργαλείο για να ταιριάζει με τις ακριβείς ανάγκες σας, το .NET reflector εξοικονομεί χρόνο και απλοποιεί την ανάπτυξη. Ας ρίξουμε μια ματιά στην πληθώρα υπηρεσιών ανάστροφης μηχανικής που παρέχει αυτό το εργαλείο:

  • Παρέχει μια εικόνα για το πώς ρέει τα δεδομένα μέσω μιας βιβλιοθήκης ή ενός στοιχείου

  • Παρέχει εικόνα για την υλοποίηση και χρήση των γλωσσών και πλαισίων του .NET

  • Βρίσκει μη τεκμηριωμένη και μη εκτεθειμένη λειτουργικότητα για να αξιοποιήσετε περισσότερα από τα APIs και τις τεχνολογίες που χρησιμοποιούνται.

  • Βρίσκει εξαρτήσεις και διαφορετικές συναρτήσεις

  • Εντοπίζει την ακριβή τοποθεσία των σφαλμάτων στον κώδικά σας, σε συστατικά τρίτων και βιβλιοθήκες.

  • Κάνει αποσφαλμάτωση στην πηγή όλου του κώδικα του .NET με τον οποίο εργάζεστε.

Πρόσθετο ILSpy για το Visual Studio Code: Μπορείτε να το έχετε σε οποιοδήποτε λειτουργικό σύστημα (μπορείτε να το εγκαταστήσετε απευθείας από το VSCode, χωρίς να χρειάζεται να κατεβάσετε το git. Κάντε κλικ στις Επεκτάσεις και αναζητήστε το ILSpy). Αν χρειάζεστε να αποσυνταγματοποιήσετε, τροποποιήσετε και επαναμεταγλωττίσετε ξανά, μπορείτε να χρησιμοποιήσετε το dnSpy ή μια ενεργά συντηρούμενη παρακλάδια του, το dnSpyEx. (Right Click -> Modify Method για να αλλάξετε κάτι μέσα σε μια λειτουργία).

Καταγραφή DNSpy

Για να κάνετε το DNSpy να καταγράφει κάποιες πληροφορίες σε ένα αρχείο, μπορείτε να χρησιμοποιήσετε αυτό το απόσπασμα:

using System.IO;
path = "C:\\inetpub\\temp\\MyTest2.txt";
File.AppendAllText(path, "Password: " + password + "\n");

Αποσφαλμάτωση με το DNSpy

Για να αποσφαλματώσετε κώδικα χρησιμοποιώντας το DNSpy πρέπει να:

Πρώτα, αλλάξτε τα Χαρακτηριστικά Συναθροίσεων που σχετίζονται με την αποσφαλμάτωση:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

Προς:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default |
DebuggableAttribute.DebuggingModes.DisableOptimizations |
DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints |
DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]

Και κάντε κλικ στο compile:

Στη συνέχεια αποθηκεύστε το νέο αρχείο μέσω File >> Save module...:

Αυτό είναι απαραίτητο επειδή αν δεν το κάνετε αυτό, κατά τη διάρκεια της εκτέλεσης θα εφαρμοστούν αρκετές βελτιστοποιήσεις στον κώδικα και είναι δυνατόν να μην επιτευχθεί ποτέ ένα σημείο διακοπής κατά την αποσφαλμάτωση ή να μην υπάρχουν κάποιες μεταβλητές.

Στη συνέχεια, εάν η εφαρμογή σας .NET τρέχει μέσω IIS μπορείτε να την επανεκκινήσετε με:

iisreset /noforce

Στη συνέχεια, για να ξεκινήσετε την εντοπισμό σφαλμάτων, πρέπει να κλείσετε όλα τα ανοιχτά αρχεία και εντός της Καρτέλας Debug επιλέξτε Σύνδεση σε Διεργασία...:

Στη συνέχεια, επιλέξτε w3wp.exe για να συνδεθείτε στο IIS server και κάντε κλικ στο σύνδεση:

Τώρα που είμαστε στη διαδικασία εντοπισμού σφαλμάτων, είναι καιρός να τη σταματήσουμε και να φορτώσουμε όλα τα modules. Κάντε κλικ πρώτα σε Debug >> Διακοπή Όλων και στη συνέχεια κάντε κλικ σε Debug >> Παράθυρα >> Modules:

Κάντε κλικ σε οποιοδήποτε module στα Modules και επιλέξτε Άνοιγμα Όλων των Modules:

Κάντε δεξί κλικ σε οποιοδήποτε module στο Assembly Explorer και κάντε κλικ στο Ταξινόμηση Συναρτήσεων:

Java decompiler

https://github.com/skylot/jadx https://github.com/java-decompiler/jd-gui/releases

Debugging DLLs

Χρησιμοποιώντας το IDA

  • Φορτώστε το rundll32 (64bit στο C:\Windows\System32\rundll32.exe και 32 bit στο C:\Windows\SysWOW64\rundll32.exe)

  • Επιλέξτε τον αποσφαλματωτή Windbg

  • Επιλέξτε "Διακοπή στη φόρτωση/εκφόρτωση βιβλιοθήκης"

  • Διαμορφώστε τις παραμέτρους της εκτέλεσης βάζοντας τη διαδρομή προς το DLL και τη συνάρτηση που θέλετε να καλέσετε:

Στη συνέχεια, όταν ξεκινήσετε τον εντοπισμό σφαλμάτων, η εκτέλεση θα σταματήσει όταν φορτωθεί κάθε DLL, έπειτα, όταν το rundll32 φορτώσει το DLL σας, η εκτέλεση θα σταματήσει.

Αλλά, πώς μπορείτε να φτάσετε στον κώδικα του DLL που φορτώθηκε; Χρησιμοποιώντας αυτήν τη μέθοδο, δεν ξέρω πώς.

Χρησιμοποιώντας x64dbg/x32dbg

  • Φορτώστε το rundll32 (64bit στο C:\Windows\System32\rundll32.exe και 32 bit στο C:\Windows\SysWOW64\rundll32.exe)

  • Αλλάξτε τη γραμμή εντολών ( Αρχείο --> Αλλαγή Γραμμής Εντολών ) και ορίστε τη διαδρομή του dll και τη συνάρτηση που θέλετε να καλέσετε, για παράδειγμα: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\14.ridii_2.dll",DLLMain

  • Αλλάξτε Επιλογές --> Ρυθμίσεις και επιλέξτε "Είσοδος DLL".

  • Στη συνέχεια ξεκινήστε την εκτέλεση, ο αποσφαλματωτής θα σταματήσει σε κάθε κύρια dll, σε κάποιο σημείο θα σταματήσετε στην είσοδο της dll του dll. Από εκεί, απλά αναζητήστε τα σημεία όπου θέλετε να τοποθετήσετε ένα σημείο διακοπής.

Σημειώστε ότι όταν η εκτέλεση σταματάει για οποιονδήποτε λόγο στο win64dbg, μπορείτε να δείτε σε ποιον κώδικα βρίσκεστε κοιτώντας στην κορυφή του παραθύρου win64dbg:

Έπειτα, κοιτώντας αυτό μπορείτε να δείτε πότε η εκτέλεση σταμάτησε στο dll που θέλετε να εντοπίσετε.

Εφαρμογές GUI / Βιντεοπαιχνίδια

Cheat Engine είναι ένα χρήσιμο πρόγραμμα για να βρείτε πού αποθηκεύονται σημαντικές τιμές μέσα στη μνήμη ενός τρέχοντος παιχνιδιού και να τις αλλάξετε. Περισσότερες πληροφορίες στο:

pageCheat Engine

PiNCE είναι ένα εργαλείο ανάπτυξης/ανάλυσης ανάστροφου για το GNU Project Debugger (GDB), εστιάζει σε παιχνίδια. Ωστόσο, μπορεί να χρησιμοποιηθεί για οτιδήποτε σχετίζεται με την ανάστροφη μηχανική

Decompiler Explorer είναι μια διαδικτυακή διεπαφή για αρκετούς αποκωδικοποποιητές. Αυτή η υπηρεσία σας επιτρέπει να συγκρίνετε την έξοδο διαφόρων αποκωδικοποποιητών σε μικρά εκτελέσιμα.

ARM & MIPS

Shellcodes

Εντοπισμός σφαλμάτων σε ένα shellcode με το blobrunner

Blobrunner θα εκχωρήσει το shellcode μέσα σε ένα χώρο μνήμης, θα εμφανίσει τη διεύθυνση μνήμης όπου εκχωρήθηκε το shellcode και θα σταματήσει την εκτέλεση. Στη συνέχεια, πρέπει να συνδέσετε έναν αποσφαλματή (Ida ή x64dbg) στη διαδικασία και να τοποθετήσετε ένα σημείο διακοπής στην ενδεικτική διεύθυνση μνήμης και να συνεχίσετε την εκτέλεση. Με αυτόν τον τρόπο θα είστε σε διαδικασία εντοπισμού σφαλμάτων στο shellcode.

Η σελίδα κυκλοφορίας στο github περιέχει zip που περιέχουν τις συνταγμένες κυκλοφορίες: https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5 Μπορείτε να βρείτε μια ελαφρώς τροποποιημένη έκδοση του Blobrunner στον ακόλουθο σύνδεσμο. Για να το συντάξετε απλά δημιουργήστε ένα έργο C/C++ στο Visual Studio Code, αντιγράψτε και επικολλήστε τον κώδικα και κάντε την κατασκευή.

pageBlobrunner

Εντοπισμός σφαλμάτων σε ένα shellcode με το jmp2it

jmp2it είναι πολύ παρόμοιο με το blobrunner. Θα εκχωρήσει το shellcode μέσα σε ένα χώρο μνήμης και θα ξεκινήσει ένα αιώνιο βρόχο. Στη συνέχεια πρέπει να συνδέσετε τον αποσφαλματή στη διαδικασία, να παίξετε, να περιμένετε 2-5 δευτερόλεπτα και να πατήσετε σταμάτημα και θα βρεθείτε μέσα στον αιώνιο βρόχο. Μεταβείτε στην επόμενη εντολή του αιώνιου βρόχου καθώς θα είναι μια κλήση στο shellcode, και τελικά θα βρεθείτε να εκτελείτε το shellcode.

Μπορείτε να κατεβάσετε μια συνταγμένη έκδοση του jmp2it μέσα από τη σελίδα κυκλοφορίας.

Εντοπισμός σφαλμάτων σε shellcode χρησιμοποιώντας το Cutter

Cutter είναι η γραφική διεπαφή του radare. Χρησιμοποιώντας το Cutter μπορείτε να εξομοιώσετε το shellcode και να το επιθεωρήσετε δυναμικά.

Σημειώστε ότι το Cutter σάς επιτρέπει να "Ανοίξετε Αρχείο" και "Ανοίξετε Shellcode". Στην περίπτωσή μου, όταν άνοιξα το shellcode ως ένα αρχείο το

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 διαθέτει επίσης ένα γραφικό εκκινητή όπου μπορείτε να επιλέξετε τις επιλογές που θέλετε και να εκτελέσετε το shellcode

Η επιλογή Create Dump θα ανακτήσει το τελικό shellcode εάν γίνει οποιαδήποτε αλλαγή δυναμικά στο shellcode στη μνήμη (χρήσιμο για να κατεβάσετε το αποκωδικοποιημένο shellcode). Το start offset μπορεί να είναι χρήσιμο για να ξεκινήσετε το shellcode σε συγκεκριμένη θέση. Η επιλογή Debug Shell είναι χρήσιμη για να εκτελέσετε αποσφαλματωμένο το shellcode χρησιμοποιώντας το τερματικό scDbg (ωστόσο θεωρώ ότι οποιαδήποτε από τις προηγούμενα εξηγημένες επιλογές είναι καλύτερες για αυτό το θέμα καθώς θα μπορείτε να χρησιμοποιήσετε το Ida ή το x64dbg).

Αποσυναρμολόγηση χρησιμοποιώντας το CyberChef

Μεταφορτώστε το αρχείο shellcode ως είσοδο και χρησιμοποιήστε την παρακάτω συνταγή για να αποσυναρμολογήσετε το: https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)

Αυτός ο obfuscator τροποποιεί όλες τις οδηγίες για mov (ναι, πραγματικά cool). Χρησιμοποιεί επίσης διακοπές για να αλλάξει τις ροές εκτέλεσης. Για περισσότερες πληροφορίες σχετικά με το πώς λειτουργεί:

Εάν έχετε τύχη, το demovfuscator θα αποκωδικοποιήσει το δυαδικό αρχείο. Έχει αρκετές εξαρτήσεις

apt-get install libcapstone-dev
apt-get install libz3-dev

Και εγκαταστήστε το keystone (apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install)

Αν παίζετε ένα CTF, αυτή η παράκαμψη για την εύρεση της σημαίας μπορεί να είναι πολύ χρήσιμη: https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html

Rust

Για να βρείτε το σημείο εισόδου αναζητήστε τις συναρτήσεις με το ::main όπως στο:

Σε αυτήν την περίπτωση το δυαδικό αρχείο ονομαζόταν authenticator, οπότε είναι αρκετά προφανές ότι αυτή είναι η ενδιαφέρουσα κύρια συνάρτηση. Έχοντας το όνομα των συναρτήσεων που καλούνται, αναζητήστε τις στο Διαδίκτυο για να μάθετε για τις εισόδους και εξόδους τους.

Delphi

Για δυαδικά αρχεία που έχουν συνταχθεί με Delphi μπορείτε να χρησιμοποιήσετε το https://github.com/crypto2011/IDR

Αν πρέπει να αναστρέψετε ένα δυαδικό αρχείο Delphi θα σας πρότεινα να χρησιμοποιήσετε το πρόσθετο του IDA https://github.com/Coldzer0/IDA-For-Delphi

Απλά πατήστε ATL+f7 (εισαγωγή πρόσθετου python στο IDA) και επιλέξτε το πρόσθετο python.

Αυτό το πρόσθετο θα εκτελέσει το δυαδικό αρχείο και θα επιλύσει δυναμικά τα ονόματα των συναρτήσεων στην έναρξη της αποσφαλμάτωσης. Μετά την έναρξη της αποσφαλμάτωσης πατήστε ξανά το κουμπί Έναρξης (το πράσινο ή f9) και θα ενεργοποιηθεί ένα σημείο αναστολής στην αρχή του πραγματικού κώδικα.

Είναι επίσης πολύ ενδιαφέρον επειδή αν πατήσετε ένα κουμπί στη γραφική εφαρμογή ο αποσφαλματωτής θα σταματήσει στη συνάρτηση που εκτελείται από αυτό το κουμπί.

Golang

Αν πρέπει να αναστρέψετε ένα δυαδικό αρχείο Golang θα σας πρότεινα να χρησιμοποιήσετε το πρόσθετο του IDA https://github.com/sibears/IDAGolangHelper

Απλά πατήστε ATL+f7 (εισαγωγή πρόσθετου python στο IDA) και επιλέξτε το πρόσθετο python.

Αυτό θα επιλύσει τα ονόματα των συναρτήσεων.

Συνταγμένο Python

Σε αυτήν τη σελίδα μπορείτε να βρείτε πώς να αντλήσετε τον κώδικα Python από ένα δυαδικό αρχείο που έχει συνταχθεί σε μορφή ELF/EXE:

pageDecompile compiled python binaries (exe, elf) - Retreive from .pyc

GBA - Game Body Advance

Αν έχετε το δυαδικό ενός παιχνιδιού GBA μπορείτε να χρησιμοποιήσετε διαφορετικά εργαλεία για να το εμμονήσετε και να το αποσφαλματώσετε:

  • no$gba (Λήψη της εκδοσης αποσφαλμάτωσης) - Περιλαμβάνει έναν αποσφαλματωτή με διεπαφή

  • mgba - Περιλαμβάνει έναν αποσφαλματωτή γραμμής εντολών

  • gba-ghidra-loader - Πρόσθετο Ghidra

  • GhidraGBA - Πρόσθετο Ghidra

Στο no$gba, στις Επιλογές --> Ρύθμιση Εξομοίωσης --> Ελέγχους** ** μπορείτε να δείτε πώς να πατήσετε τα κουμπιά του Game Boy Advance buttons

Όταν πατιούνται, κάθε κλειδί έχει μια τιμή για να το αναγνωρίσετε:

A = 1
B = 2
SELECT = 4
START = 8
RIGHT = 16
LEFT = 32
UP = 64
DOWN = 128
R = 256
L = 256

Έτσι, σε αυτού του είδους το πρόγραμμα, το ενδιαφέρον μέρος θα είναι πώς το πρόγραμμα χειρίζεται την είσοδο του χρήστη. Στη διεύθυνση 0x4000130 θα βρείτε τη συνάρτηση που συναντάται συχνά: KEYINPUT.

Στην προηγούμενη εικόνα μπορείτε να δείτε ότι η συνάρτηση καλείται από τη FUN_080015a8 (διευθύνσεις: 0x080015fa και 0x080017ac).

Σε εκείνη τη συνάρτηση, μετά από μερικές λειτουργίες εκκίνησης (χωρίς καμία σημασία):

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;

Βρέθηκε αυτός ο κώδικας:

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) {

Το τελευταίο if ελέγχει αν το uVar4 βρίσκεται στα τελευταία Keys και δεν είναι το τρέχον κλειδί, επίσης αναφέρεται στο να αφήσετε ένα κουμπί (το τρέχον κλειδί αποθηκεύεται στο 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;

Στον προηγούμενο κώδικα μπορείτε να δείτε ότι συγκρίνουμε το uVar1 (το μέρος όπου βρίσκεται η τιμή του πατημένου κουμπιού) με μερικές τιμές:

  • Αρχικά, συγκρίνεται με τη τιμή 4 (κουμπί SELECT): Στην πρόκληση αυτό το κουμπί καθαρίζει την οθόνη

  • Στη συνέχεια, συγκρίνεται με τη τιμή 8 (κουμπί START): Στην πρόκληση αυτό ελέγχει αν ο κώδικας είναι έγκυρος για να λάβετε τη σημαία.

  • Σε αυτήν την περίπτωση η μεταβλητή DAT_030000d8 συγκρίνεται με 0xf3 και αν η τιμή είναι ίδια εκτελείται κάποιος κώδικας.

  • Σε οποιεσδήποτε άλλες περιπτώσεις, ελέγχεται μια μεταβλητή cont (DAT_030000d4). Είναι μια μεταβλητή cont επειδή προστίθεται 1 αμέσως μετά την εισαγωγή του κώδικα. Αν είναι λιγότερο από 8 κάτι που συνεπάγεται την προσθήκη τιμών στο DAT_030000d8 γίνεται (βασικά προσθέτει τις τιμές των πλήκτρων που πατήθηκαν σε αυτήν τη μεταβλητή όσο η μεταβλητή cont είναι μικρότερη από 8).

Έτσι, σε αυτήν την πρόκληση, γνωρίζοντας τις τιμές των κουμπιών, έπρεπε να πατήσετε μια συνδυασμό με μήκος μικρότερο από 8 ώστε το αποτέλεσμα της πρόσθεσης να είναι 0xf3.

Αναφορά για αυτό το εγχειρίδιο: https://exp.codes/Nostalgia/

Game Boy

Μαθήματα

Try Hard Security Group

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated