Reversing Tools & Basic Methods
Try Hard Security Group
Εργαλεία Αναστροφής Βασισμένα στο ImGui
Λογισμικό:
ReverseKit: https://github.com/zer0condition/ReverseKit
Wasm αποσυνταγματοποιητής / Μεταγλωττιστής Wat
Online:
Χρησιμοποιήστε το https://webassembly.github.io/wabt/demo/wasm2wat/index.html για αποσυνταγματοποίηση από wasm (δυαδικό) σε wat (καθαρό κείμενο)
Χρησιμοποιήστε το https://webassembly.github.io/wabt/demo/wat2wasm/ για μεταγλώττιση από wat σε wasm
Μπορείτε επίσης να δοκιμάσετε το https://wwwg.github.io/web-wasmdec/ για αποσυνταγματοποίηση
Λογισμικό:
.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 να καταγράφει κάποιες πληροφορίες σε ένα αρχείο, μπορείτε να χρησιμοποιήσετε αυτό το απόσπασμα:
Αποσφαλμάτωση με το DNSpy
Για να αποσφαλματώσετε κώδικα χρησιμοποιώντας το DNSpy πρέπει να:
Πρώτα, αλλάξτε τα Χαρακτηριστικά Συναθροίσεων που σχετίζονται με την αποσφαλμάτωση:
Προς:
Και κάντε κλικ στο compile:
Στη συνέχεια αποθηκεύστε το νέο αρχείο μέσω File >> Save module...:
Αυτό είναι απαραίτητο επειδή αν δεν το κάνετε αυτό, κατά τη διάρκεια της εκτέλεσης θα εφαρμοστούν αρκετές βελτιστοποιήσεις στον κώδικα και είναι δυνατόν να μην επιτευχθεί ποτέ ένα σημείο διακοπής κατά την αποσφαλμάτωση ή να μην υπάρχουν κάποιες μεταβλητές.
Στη συνέχεια, εάν η εφαρμογή σας .NET τρέχει μέσω IIS μπορείτε να την επανεκκινήσετε με:
Στη συνέχεια, για να ξεκινήσετε την εντοπισμό σφαλμάτων, πρέπει να κλείσετε όλα τα ανοιχτά αρχεία και εντός της Καρτέλας 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 EnginePiNCE είναι ένα εργαλείο ανάπτυξης/ανάλυσης ανάστροφου για το 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 διαθέτει επίσης ένα γραφικό εκκινητή όπου μπορείτε να επιλέξετε τις επιλογές που θέλετε και να εκτελέσετε το 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 θα αποκωδικοποιήσει το δυαδικό αρχείο. Έχει αρκετές εξαρτήσεις
Και εγκαταστήστε το 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 .pycGBA - Game Body Advance
Αν έχετε το δυαδικό ενός παιχνιδιού GBA μπορείτε να χρησιμοποιήσετε διαφορετικά εργαλεία για να το εμμονήσετε και να το αποσφαλματώσετε:
no$gba (Λήψη της εκδοσης αποσφαλμάτωσης) - Περιλαμβάνει έναν αποσφαλματωτή με διεπαφή
mgba - Περιλαμβάνει έναν αποσφαλματωτή γραμμής εντολών
gba-ghidra-loader - Πρόσθετο Ghidra
GhidraGBA - Πρόσθετο Ghidra
Στο no$gba, στις Επιλογές --> Ρύθμιση Εξομοίωσης --> Ελέγχους** ** μπορείτε να δείτε πώς να πατήσετε τα κουμπιά του Game Boy Advance buttons
Όταν πατιούνται, κάθε κλειδί έχει μια τιμή για να το αναγνωρίσετε:
Έτσι, σε αυτού του είδους το πρόγραμμα, το ενδιαφέρον μέρος θα είναι πώς το πρόγραμμα χειρίζεται την είσοδο του χρήστη. Στη διεύθυνση 0x4000130 θα βρείτε τη συνάρτηση που συναντάται συχνά: KEYINPUT.
Στην προηγούμενη εικόνα μπορείτε να δείτε ότι η συνάρτηση καλείται από τη FUN_080015a8 (διευθύνσεις: 0x080015fa και 0x080017ac).
Σε εκείνη τη συνάρτηση, μετά από μερικές λειτουργίες εκκίνησης (χωρίς καμία σημασία):
Βρέθηκε αυτός ο κώδικας:
Το τελευταίο if ελέγχει αν το uVar4
βρίσκεται στα τελευταία Keys και δεν είναι το τρέχον κλειδί, επίσης αναφέρεται στο να αφήσετε ένα κουμπί (το τρέχον κλειδί αποθηκεύεται στο uVar1
).
Στον προηγούμενο κώδικα μπορείτε να δείτε ότι συγκρίνουμε το 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
Μαθήματα
https://github.com/malrev/ABD (Αποκωδικοποίηση δυαδικών)
Try Hard Security Group
Last updated