hacktricks/reversing/reversing-tools-basic-methods
2023-09-03 01:45:18 +00:00
..
angr Translated to Japanese 2023-07-07 23:42:27 +00:00
blobrunner.md Translated to Japanese 2023-07-07 23:42:27 +00:00
cheat-engine.md Translated to Japanese 2023-07-07 23:42:27 +00:00
README.md Translated ['generic-methodologies-and-resources/exfiltration.md', 'gene 2023-09-03 01:45:18 +00:00
satisfiability-modulo-theories-smt-z3.md Translated to Japanese 2023-07-07 23:42:27 +00:00

リバースエンジニアリングツールと基本的な手法

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

重要な脆弱性を見つけて修正を迅速化しましょう。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


ImGuiベースのリバースエンジニアリングツール

ソフトウェア:

Wasmデコンパイラ/ Watコンパイラ

オンライン:

ソフトウェア:

.Netデコンパイラ

dotPeek

dotPeekは、ライブラリ.dllWindowsメタデータファイル.winmd実行可能ファイル.exeなど、複数の形式をデコンパイルおよび調査するデコンパイラです。デコンパイルされたアセンブリは、Visual Studioプロジェクト.csprojとして保存できます。

ここでの利点は、失われたソースコードを復元する場合に、時間を節約できることです。さらに、dotPeekはデコンパイルされたコード全体で便利なナビゲーションを提供するため、Xamarinアルゴリズム分析に最適なツールの1つです。

.Net Reflector

包括的なアドインモデルと、ツールを拡張して独自のニーズに合わせるAPIを備えた.NETリフレクタは、時間を節約し、開発を簡素化します。このツールが提供する逆向きエンジニアリングサービスの多様性を見てみましょう。

  • データがライブラリやコンポーネントを介してどのように流れるかを示します。
  • .NET言語とフレームワークの実装と使用方法を示します。
  • 使用されているAPIとテクロジーからより多くの情報を取得するために、ドキュメント化されていない機能や公開されていない機能を見つけます。
  • 依存関係と異なるアセンブリを見つけます。
  • コード、サードパーティのコンポーネント、およびライブラリのエラーの正確な位置を特定します。

ILSpy & dnSpy

Visual Studio Code用のILSpyプラグインどのOSでも使用できますVSCodeから直接インストールできます。gitをダウンロードする必要はありません。ExtensionsをクリックしてILSpyを検索します)。
デコンパイル変更再コンパイルが必要な場合は、https://github.com/0xd4d/dnSpy/releasesを使用できます(関数内の何かを変更するには、右クリック->メソッドの変更)。
https://www.jetbrains.com/es-es/decompiler/も試すことができます。

DNSpyログ

DNSpyが情報をファイルに記録するようにするために、次の.Netの行を使用できます

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

DNSpy デバッグ

DNSpyを使用してコードをデバッグするには、次の手順を実行する必要があります。

まず、デバッグに関連する アセンブリ属性を変更します:

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

reversing-tools-basic-methods/README.md

Reversing Tools: Basic Methods

Introduction

In the field of reverse engineering, having a good set of reversing tools is essential. These tools help in analyzing and understanding the inner workings of software, allowing us to uncover vulnerabilities, modify functionality, or simply gain a deeper understanding of how a program operates.

This guide will introduce you to some of the basic reversing tools commonly used by hackers and security professionals. By familiarizing yourself with these tools, you will be better equipped to analyze and manipulate software for various purposes.

Contents

  1. IDA Pro
  2. OllyDbg
  3. Ghidra
  4. Radare2
  5. x64dbg

IDA Pro

IDA Pro is a widely used disassembler and debugger that is known for its powerful analysis capabilities. It supports a wide range of executable formats and architectures, making it a versatile tool for reverse engineering.

Some key features of IDA Pro include:

  • Interactive disassembly and debugging
  • Graphical representation of code flow
  • Support for multiple platforms and file formats
  • Extensibility through plugins and scripts

IDA Pro is a commercial tool, but a free version called IDA Free is also available with limited functionality.

OllyDbg

OllyDbg is a popular debugger that is commonly used for analyzing and modifying binary code. It provides a user-friendly interface and a wide range of features that make it suitable for both beginners and experienced reverse engineers.

Key features of OllyDbg include:

  • Dynamic analysis of running processes
  • Breakpoint and tracing functionality
  • Patching and modification of code
  • Plugin support for extending functionality

OllyDbg is a freeware tool that is widely used in the reverse engineering community.

Ghidra

Ghidra is a powerful open-source software reverse engineering framework developed by the National Security Agency (NSA). It provides a wide range of analysis tools and features that make it suitable for both beginners and advanced users.

Some key features of Ghidra include:

  • Decompilation of binary code
  • Symbolic execution and data flow analysis
  • Scripting support for automation
  • Collaboration features for team-based analysis

Ghidra is free to use and is available for Windows, macOS, and Linux.

Radare2

Radare2 is a command-line based reverse engineering framework that is known for its versatility and extensibility. It provides a wide range of tools and features for analyzing and manipulating binary code.

Key features of Radare2 include:

  • Disassembly and debugging capabilities
  • Support for multiple architectures and file formats
  • Scripting support for automation
  • Plugin system for extending functionality

Radare2 is an open-source tool that is available for Windows, macOS, and Linux.

x64dbg

x64dbg is a user-friendly debugger that is commonly used for analyzing and debugging 64-bit Windows executables. It provides a simple and intuitive interface, making it suitable for both beginners and experienced reverse engineers.

Some key features of x64dbg include:

  • Dynamic analysis of running processes
  • Breakpoint and tracing functionality
  • Patching and modification of code
  • Plugin support for extending functionality

x64dbg is an open-source tool that is available for Windows.


リバースエンジニアリングツール:基本的な手法

はじめに

リバースエンジニアリングの分野では、優れたリバースエンジニアリングツールセットを持つことが重要です。これらのツールは、ソフトウェアの内部動作を分析し理解するのに役立ち、脆弱性を発見したり、機能を変更したり、プログラムの動作をより深く理解することができます。

このガイドでは、ハッカーやセキュリティ専門家がよく使用するいくつかの基本的なリバースエンジニアリングツールを紹介します。これらのツールに慣れることで、さまざまな目的のためにソフトウェアを分析し操作するための準備が整います。

目次

  1. IDA Pro
  2. OllyDbg
  3. Ghidra
  4. Radare2
  5. x64dbg

IDA Pro

IDA Proは、強力な解析機能で知られる広く使用されている逆アセンブラおよびデバッガです。さまざまな実行可能形式とアーキテクチャをサポートしており、リバースエンジニアリングのための多目的なツールとして使用できます。

IDA Proの主な特徴は次のとおりです

  • インタラクティブな逆アセンブリとデバッグ
  • コードフローのグラフィカルな表示
  • 複数のプラットフォームとファイル形式のサポート
  • プラグインとスクリプトによる拡張性

IDA Proは商用ツールですが、機能が制限された無料版であるIDA Freeも利用できます。

OllyDbg

OllyDbgは、バイナリコードの解析と修正によく使用される人気のあるデバッガです。ユーザーフレンドリーなインターフェースと幅広い機能を提供しており、初心者から経験豊富なリバースエンジニアまで対応しています。

OllyDbgの主な特徴は次のとおりです

  • 実行中のプロセスの動的解析
  • ブレークポイントとトレース機能
  • コードのパッチと修正
  • 機能の拡張のためのプラグインサポート

OllyDbgは、リバースエンジニアリングコミュニティで広く使用されているフリーウェアツールです。

Ghidra

Ghidraは、アメリカ国家安全保障局NSAによって開発された強力なオープンソースのソフトウェアリバースエンジニアリングフレームワークです。初心者から上級者まで対応するさまざまな分析ツールと機能を提供しています。

Ghidraの主な特徴は次のとおりです

  • バイナリコードの逆コンパイル
  • シンボリック実行とデータフロー解析
  • 自動化のためのスクリプトサポート
  • チームベースの分析のためのコラボレーション機能

Ghidraは無料で使用でき、Windows、macOS、Linuxに対応しています。

Radare2

Radare2は、多機能性と拡張性で知られるコマンドラインベースのリバースエンジニアリングフレームワークです。バイナリコードの分析と操作のためのさまざまなツールと機能を提供しています。

Radare2の主な特徴は次のとおりです

  • 逆アセンブリとデバッグの機能
  • 複数のアーキテクチャとファイル形式のサポート
  • 自動化のためのスクリプトサポート
  • 機能の拡張のためのプラグインシステム

Radare2はオープンソースツールであり、Windows、macOS、Linuxに対応しています。

x64dbg

x64dbgは、64ビットWindows実行可能ファイルの解析とデバッグによく使用される使いやすいデバッガです。シンプルで直感的なインターフェースを提供しており、初心者から経験豊富なリバースエンジニアまで対応しています。

x64dbgの主な特徴は次のとおりです

  • 実行中のプロセスの動的解析
  • ブレークポイントとトレース機能
  • コードのパッチと修正
  • 機能の拡張のためのプラグインサポート

x64dbgはオープンソースツールであり、Windowsに対応しています。

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

そして、コンパイルをクリックします:

次に、新しいファイルを ファイル >> モジュールを保存... に保存します:

これは必要です。なぜなら、これを行わない場合、ランタイムでいくつかの最適化がコードに適用され、デバッグ中にブレークポイントがヒットしないか、いくつかの変数が存在しない可能性があるからです。

次に、.NetアプリケーションがIISで実行されている場合、次のコマンドで再起動できます:

iisreset /noforce

次に、デバッグを開始するためには、すべての開いているファイルを閉じ、デバッグタブプロセスにアタッチを選択します:

次に、w3wp.exeを選択してIISサーバーにアタッチし、アタッチをクリックします:

プロセスのデバッグが開始されたので、それを停止してすべてのモジュールをロードします。まず、デバッグ >> 中断 をクリックし、次に デバッグ >> ウィンドウ >> モジュール をクリックします:

モジュールの中の任意のモジュールをクリックし、すべてのモジュールを開くを選択します:

アセンブリエクスプローラの中の任意のモジュールを右クリックし、アセンブリをソートをクリックします:

Javaデコンパイラ

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

DLLのデバッグ

IDAを使用する

  • rundll32をロードします64ビットはC:\Windows\System32\rundll32.exe、32ビットはC:\Windows\SysWOW64\rundll32.exe
  • Windbgデバッガを選択します。
  • "ライブラリのロード/アンロード時に中断"を選択します。

  • 実行のパラメータを設定し、DLLのパスと呼び出したい関数を入力します:

それから、デバッグを開始すると、各DLLがロードされるたびに実行が停止します。rundll32がDLLをロードすると、実行が停止します。

しかし、ロードされたDLLのコードにどうやってアクセスできるのでしょうかこの方法では、私はわかりません。

x64dbg/x32dbgを使用する

  • rundll32をロードします64ビットはC:\Windows\System32\rundll32.exe、32ビットは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は、実行中のゲームのメモリ内に重要な値が保存されている場所を見つけて変更するための便利なプログラムです。詳細は以下を参照してください:

{% content-ref url="cheat-engine.md" %} cheat-engine.md {% endcontent-ref %}

ARM & MIPS

{% embed url="https://github.com/nongiach/arm_now" %}

シェルコード

blobrunnerを使用したシェルコードのデバッグ

Blobrunnerは、シェルコードをメモリ内のスペースに割り当て、シェルコードが割り当てられたメモリアドレスを示し、実行を停止します。
その後、プロセスにデバッガIdaまたはx64dbgアタッチし、指定されたメモリアドレスにブレークポイントを設定し、実行を再開します。これにより、シェルコードをデバッグできます。

リリースのGitHubページには、コンパイルされたリリースが含まれるzipファイルがありますhttps://github.com/OALabs/BlobRunner/releases/tag/v0.0.5
以下のリンクに、Blobrunnerのわずかに変更されたバージョンがあります。コンパイルするには、Visual Studio CodeでC/C++プロジェクトを作成し、コードをコピーして貼り付け、ビルドします。

{% content-ref url="blobrunner.md" %} blobrunner.md {% endcontent-ref %}

jmp2itを使用したシェルコードのデバッグ

jmp2it は、blobrunnerと非常に似ています。シェルコードをメモリ内のスペースに割り当てし、永遠のループを開始します。その後、プロセスにデバッガをアタッチし、再生を開始し、2〜5秒待って停止し、自分自身が永遠のループの中にいることに気付くでしょう。永遠のループの次の命令にジャンプすると、シェルコードを呼び出す命令になるため、最終的にシェルコードを実行することができます。

リリースページからjmp2itのコンパイル済みバージョンをダウンロードできます

Cutterを使用したシェルコードのデバッグ

Cutterは、radareのGUIです。Cutterを使用すると、シェルコードをエミュレートして動的に検査できます。

Cutterでは、「ファイルを開く」と「シェルコードを開く」の両方が可能です。私の場合、シェルコードをファイルとして開いた場合は正しく逆コンパイルされましたが、シェルコードとして開いた場合は逆コンパイルされませんでした

特定の場所でエミュレーションを開始するには、そこにブレークポイントを設定し、おそらくCutterが自動的にそこからエミュレーションを開始するようにします

例えば、ヘックスダンプ内でスタックを表示できます:

シェルコードの難読化を解除し、実行される関数を取得する

scdbgを試してみるべきです。
それは、シェルコードがどのような関数を使用しているか、またシェルコードがメモリ内で自己解読しているかを教えてくれます。

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には、グラフィカルなランチャーもあります。ここで、必要なオプションを選択してシェルコードを実行することができます。

Create Dumpオプションは、シェルコードがメモリ内で動的に変更された場合に、最終的なシェルコードをダンプします(デコードされたシェルコードをダウンロードするのに便利です)。start offsetは、特定のオフセットでシェルコードを開始するのに役立ちます。Debug Shellオプションは、scDbgターミナルを使用してシェルコードをデバッグするのに便利ですただし、前述のオプションのいずれかを使用する方が、Idaやx64dbgを使用できるため、より良いです

CyberChefを使用した逆アセンブル

シェルコードファイルをアップロードし、次のレシピを使用して逆アセンブルします: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

最も重要な脆弱性を見つけて修正を迅速化しましょう。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリまで、クラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


Rust

エントリーポイントを見つけるには、::mainという関数を検索します。例えば:

この場合、バイナリの名前はauthenticatorと呼ばれているため、これが興味深いmain関数であることは明らかです。
呼び出される関数の名前を持っている場合、それらをインターネットで検索して、その入力出力について学びます。

Delphi

Delphiでコンパイルされたバイナリには、https://github.com/crypto2011/IDRを使用できます。

Delphiバイナリをリバースエンジニアリングする場合は、IDAプラグインhttps://github.com/Coldzer0/IDA-For-Delphiを使用することをおすすめします。

ATL+f7IDAでPythonプラグインをインポートを押して、Pythonプラグインを選択します。

このプラグインはバイナリを実行し、デバッグの開始時に関数名を動的に解決します。デバッグを開始した後、再びStartボタン緑色のボタンまたはf9を押すと、実際のコードの最初にブレークポイントがヒットします。

また、グラフィックアプリケーションでボタンを押すと、デバッガはそのボタンによって実行される関数で停止します。

Golang

Golangのバイナリをリバースエンジニアリングする場合は、IDAプラグインhttps://github.com/sibears/IDAGolangHelperを使用することをおすすめします。

ATL+f7IDAでPythonプラグインをインポートを押して、Pythonプラグインを選択します。

これにより、関数の名前が解決されます。

コンパイルされたPython

このページでは、ELF/EXE形式のPythonコンパイルバイナリからPythonコードを取得する方法が説明されています

{% content-ref url="../../forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md" %} .pyc.md {% endcontent-ref %}

GBA - ゲームボーイアドバンス

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押されたボタンの値が格納される場所)といくつかの値を比較しています:

  • 最初に、値4SELECTボタン)と比較されます:このボタンはチャレンジでは画面をクリアします。
  • 次に、値8STARTボタン)と比較されます:このボタンはチャレンジでフラグを取得するためのコードが有効かどうかをチェックします。
  • この場合、変数**DAT_030000d8**は0xf3と比較され、値が同じであればいくつかのコードが実行されます。
  • それ以外の場合、いくつかのcontDAT_030000d4がチェックされます。これはcontであるため、コードに入った直後に1が追加されます。
    8未満の場合、DAT_030000d8に値を追加する何かが行われます基本的には、contが8未満の間、押されたキーの値をこの変数に追加しています

したがって、このチャレンジでは、ボタンの値を知っている場合、長さが8未満で、結果の加算が0xf3になる組み合わせを押す必要があります

このチュートリアルの参考資料: https://exp.codes/Nostalgia/

ゲームボーイ

{% embed url="https://www.youtube.com/watch?v=VVbRe7wr3G4" %}

コース

最も重要な脆弱性を見つけて、修正を迅速に行いましょう。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリまで、クラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥