hacktricks/reversing-and-exploiting/reversing-tools-basic-methods
2024-04-06 19:41:21 +00:00
..
angr GitBook: No commit message 2024-04-06 19:41:21 +00:00
blobrunner.md GitBook: No commit message 2024-04-06 19:41:21 +00:00
cheat-engine.md GitBook: No commit message 2024-04-06 19:41:21 +00:00
README.md GitBook: No commit message 2024-04-06 19:41:21 +00:00
satisfiability-modulo-theories-smt-z3.md GitBook: No commit message 2024-04-06 19:41:21 +00:00

Reversing Tools & Basic Methods

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}


Інструменти реверс-інжинірингу на основі ImGui

Програмне забезпечення:

Декомпілятор Wasm / Компілятор Wat

Онлайн:

Програмне забезпечення:

.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 (так, дійсно круто). Він також використовує переривання для зміни потоків виконання. Для отримання додаткової інформації про те, як це працює:

Якщо ви пощастить, 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" %}

Курси

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks: