.. | ||
angr | ||
blobrunner.md | ||
cheat-engine.md | ||
README.md | ||
satisfiability-modulo-theories-smt-z3.md |
Reversing Tools & Basic Methods
Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!
Інші способи підтримки HackTricks:
- Якщо ви хочете побачити вашу компанію в рекламі на HackTricks або завантажити HackTricks у PDF Перевірте ПЛАНИ ПІДПИСКИ!
- Отримайте офіційний PEASS & HackTricks мерч
- Відкрийте для себе Сім'ю PEASS, нашу колекцію ексклюзивних NFT
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами на Twitter 🐦 @carlospolopm.
- Поділіться своїми хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв GitHub.
Try Hard Security Group
{% embed url="https://discord.gg/tryhardsecurity" %}
Інструменти реверс-інжинірингу на основі ImGui
Програмне забезпечення:
- ReverseKit: https://github.com/zer0condition/ReverseKit
Декомпілятор Wasm / Компілятор Wat
Онлайн:
- Використовуйте 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
dotPeek - це декомпілятор, який декомпілює та досліджує кілька форматів, включаючи бібліотеки (.dll), файли метаданих Windows (.winmd) та виконувані файли (.exe). Після декомпіляції збірки можна зберегти як проект Visual Studio (.csproj).
Тут перевага полягає в тому, що якщо втрачений вихідний код потребує відновлення з легасі-збірки, ця дія може зекономити час. Крім того, dotPeek надає зручну навігацію по декомпільованому коду, що робить його одним з ідеальних інструментів для аналізу алгоритмів Xamarin.
.NET Reflector
З великим моделлю додатків та API, яке розширює інструмент для відповідності вашим точним потребам, .NET Reflector зекономить час і спростить розробку. Давайте розглянемо плеяду послуг з обертання, які надає цей інструмент:
- Надає уявлення про те, як дані протікають через бібліотеку або компонент
- Надає уявлення про реалізацію та використання мов та фреймворків .NET
- Знаходить недокументовану та невикладену функціональність для отримання більше з API та використовуваних технологій.
- Знаходить залежності та різні збірки
- Відстежує точне місце помилок у вашому коді, сторонніх компонентах та бібліотеках.
- Відлагоджує вихідний код всього .NET, з яким ви працюєте.
ILSpy & dnSpy
ILSpy плагін для Visual Studio Code: Ви можете мати його в будь-якій ОС (ви можете встановити його безпосередньо з VSCode, не потрібно завантажувати git. Клацніть на Extensions та search ILSpy).
Якщо вам потрібно декомпілювати, змінювати та перекомпілювати знову, ви можете використовувати dnSpy або активно підтримувану гілку, dnSpyEx. (Right Click -> Modify Method для зміни чогось всередині функції).
DNSpy Logging
Для того, щоб зробити 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)]
І натисніть на компіляцію:
Потім збережіть новий файл через Файл >> Зберегти модуль...:
Це необхідно, оскільки якщо ви цього не зробите, під час виконання коду буде застосовано кілька оптимізацій, і можливо, що під час налагодження точка зупинки не буде досягнута або деякі змінні не існують.
Потім, якщо ваша програма .NET запущена на IIS, ви можете її перезапустити за допомогою:
iisreset /noforce
Потім, щоб розпочати налагодження, вам слід закрити всі відкриті файли та вибрати Attach to Process... в Debug Tab:
Потім виберіть w3wp.exe для підключення до IIS server та натисніть attach:
Тепер, коли ми налагоджуємо процес, настав час зупинити його та завантажити всі модулі. Спочатку клацніть на Debug >> Break All, а потім клацніть на Debug >> Windows >> Modules:
Клацніть на будь-який модуль в Modules та виберіть Open All Modules:
Клацніть правою кнопкою миші на будь-який модуль в Assembly Explorer та клацніть Sort Assemblies:
Декомпілятор Java
https://github.com/skylot/jadx
https://github.com/java-decompiler/jd-gui/releases
Налагодження DLLs
Використання IDA
- Завантажте rundll32 (64-бітний у C:\Windows\System32\rundll32.exe та 32-бітний у C:\Windows\SysWOW64\rundll32.exe)
- Виберіть Windbg debugger
- Виберіть "Suspend on library load/unload"
- Налаштуйте параметри виконання, вказавши шлях до DLL та функцію, яку ви хочете викликати:
Отже, коли ви почнете налагодження, виконання буде зупинено при завантаженні кожної DLL, тоді, коли rundll32 завантажить вашу DLL, виконання буде зупинено.
Але як ви можете перейти до коду DLL, який був завантажений? Використовуючи цей метод, я не знаю як.
Використання x64dbg/x32dbg
- Завантажте rundll32 (64-бітний у C:\Windows\System32\rundll32.exe та 32-бітний у C:\Windows\SysWOW64\rundll32.exe)
- Змініть командний рядок ( File --> Change Command Line ) та встановіть шлях до dll та функцію, яку ви хочете викликати, наприклад: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\14.ridii_2.dll",DLLMain
- Змініть Options --> Settings та виберіть "DLL Entry".
- Потім запустіть виконання, відладчик зупиниться на кожному головному dll, в певний момент ви зупинитеся в dll Entry вашої dll. Звідти просто шукайте місця, де ви хочете встановити точку зупинки.
Зверніть увагу, що коли виконання зупиняється з будь-якої причини в win64dbg, ви можете побачити в якому коді ви перебуваєте вгорі вікна win64dbg:
Отже, дивлячись на це, ви можете побачити, коли виконання зупинилося в dll, яку ви хочете налагоджувати.
GUI Apps / Відеоігри
Cheat Engine - корисна програма для пошуку де зберігаються важливі значення в пам'яті запущеної гри та їх зміни. Додаткова інформація:
{% content-ref url="cheat-engine.md" %} cheat-engine.md {% endcontent-ref %}
ARM & MIPS
{% embed url="https://github.com/nongiach/arm_now" %}
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, скопіюйте та вставте код та зіберіть його.
{% content-ref url="blobrunner.md" %} blobrunner.md {% endcontent-ref %}
Налагодження shellcode за допомогою jmp2it
jmp2it дуже схожий на blobrunner. Він розмістить shellcode в пам'яті та розпочне вічний цикл. Потім вам потрібно підключити відладчик до процесу, почати виконання, зачекати 2-5 секунд та натиснути stop, і ви опинитесь в вічному циклі. Перейдіть до наступної інструкції вічного циклу, оскільки це буде виклик shellcode, і нарешті ви опинитеся виконанням shellcode.
Ви можете завантажити скомпільовану версію jmp2it на сторінці релізів.
Налагодження shellcode за допомогою Cutter
Cutter - це GUI radare. За допомогою Cutter ви можете емулювати shellcode та динамічно його переглядати.
Зверніть увагу, що Cutter дозволяє вам "Open File" та "Open Shellcode". У моєму випадку, коли я відкрив shellcode як файл, він правильно декомпілював його, але коли я відкрив його як shellcode, це не вдалося:
Щоб розпочати емуляцію в потрібному місці, встановіть там bp, і, схоже, Cutter автоматично розпочне емуляцію з цього місця:
Ви можете побачити стек, наприклад, у вигляді шістнадцяткового дампу:
Деобфускація shellcode та отримання виконуваних функцій
Вам слід спробувати scdbg.
Він розкаже вам, які функції використовує 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)
Movfuscator
Цей обфускатор змінює всі інструкції для mov
(так, дійсно круто). Він також використовує переривання для зміни потоків виконання. Для отримання додаткової інформації про те, як це працює:
- https://www.youtube.com/watch?v=2VF_wPkiBJY
- https://github.com/xoreaxeaxeax/movfuscator/blob/master/slides/domas_2015_the_movfuscator.pdf
Якщо ви пощастить, 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.
Цей плагін виконає бінарний файл та динамічно вирішить імена функцій на початку налагодження. Після початку налагодження натисніть ще раз кнопку Start (зелену або f9), і точка зупинки вразить на початку реального коду.
Це також дуже цікаво, оскільки якщо ви натиснете кнопку в графічному застосунку, відладчик зупиниться в функції, яку виконує ця кнопка.
Golang
Якщо вам потрібно розібрати бінарний файл Golang, я б рекомендував вам використовувати плагін IDA https://github.com/sibears/IDAGolangHelper
Просто натисніть ATL+f7 (імпортуйте плагін Python в IDA) та виберіть плагін Python.
Це вирішить імена функцій.
Скомпільований Python
На цій сторінці ви можете дізнатися, як отримати код Python з скомпільованого бінарного файлу ELF/EXE python:
{% content-ref url="../../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md" %} .pyc.md {% endcontent-ref %}
GBA - Гра Body Advance
Якщо у вас є бінарний файл гри GBA, ви можете використовувати різні інструменти для емуляції та налагодження його:
- no$gba (Завантажте версію для налагодження) - Містить відладчик з інтерфейсом
- mgba - Містить CLI відладчик
- gba-ghidra-loader - Плагін Ghidra
- GhidraGBA - Плагін Ghidra
У no$gba, в Options --> Emulation Setup --> Controls** ** ви можете побачити, як натискати кнопки Game Boy Advance
При натисканні кожна клавіша має значення, щоб ідентифікувати її:
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
знаходиться в останніх ключах і не є поточним ключем, також відомим як відпускання кнопки (поточний ключ зберігається в 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/
Геймбой
{% embed url="https://www.youtube.com/watch?v=VVbRe7wr3G4" %}
Курси
- https://github.com/0xZ0F/Z0FCourse_ReverseEngineering
- https://github.com/malrev/ABD (Деобфускація бінарних файлів)
Try Hard Security Group
{% embed url="https://discord.gg/tryhardsecurity" %}
Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!
Інші способи підтримки HackTricks:
- Якщо ви хочете побачити вашу компанію рекламовану в HackTricks або завантажити HackTricks у PDF Перевірте ПЛАНИ ПІДПИСКИ!
- Отримайте офіційний PEASS & HackTricks мерч
- Відкрийте для себе Сім'ю PEASS, нашу колекцію ексклюзивних NFT
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами на Twitter 🐦 @carlospolopm.
- Поділіться своїми хакерськими трюками, надсилайте PR до HackTricks та HackTricks Cloud github репозиторіїв.