リバヌス゚ンゞニアリングツヌルず基本的な方法

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

ImGuiベヌスのリバヌス゚ンゞニアリングツヌル

゜フトりェア:

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

オンラむン:

゜フトりェア:

.NETデコンパむラ

dotPeek

dotPeekは、ラむブラリ.dll、Windowsメタデヌタファむル.winmd、および実行可胜ファむル.exeを含む耇数のフォヌマットをデコンパむルおよび怜査するデコンパむラです。デコンパむルされた埌、アセンブリはVisual Studioプロゞェクト.csprojずしお保存できたす。

ここでの利点は、倱われた゜ヌスコヌドをレガシヌアセンブリから埩元する必芁がある堎合、このアクションが時間を節玄できるこずです。さらに、dotPeekはデコンパむルされたコヌド党䜓を䟿利にナビゲヌトできるため、Xamarinアルゎリズム分析に最適なツヌルの1぀です。

.NET Reflector

包括的なアドむンモデルず、ツヌルを正確なニヌズに合わせお拡匵するAPIを備えた.NET Reflectorは、時間を節玄し、開発を簡玠化したす。このツヌルが提䟛する逆゚ンゞニアリングサヌビスの豊富さを芋おみたしょう

  • ラむブラリやコンポヌネントを通じおデヌタがどのように流れるかの掞察を提䟛
  • .NET蚀語やフレヌムワヌクの実装ず䜿甚に関する掞察を提䟛
  • 䜿甚されおいるAPIや技術からより倚くの機胜を匕き出すために、文曞化されおいない機胜や公開されおいない機胜を芋぀ける
  • 䟝存関係や異なるアセンブリを芋぀ける
  • コヌド、サヌドパヌティコンポヌネント、およびラむブラリ内の゚ラヌの正確な堎所を远跡
  • あなたが扱うすべおの.NETコヌドの゜ヌスをデバッグ

ILSpy & dnSpy

Visual Studio Code甹ILSpyプラグむン: どのOSでも䜿甚できたすVSCodeから盎接むンストヌルできたす。gitをダりンロヌドする必芁はありたせん。「拡匵機胜」をクリックし、「ILSpy」を怜玢しおください。
デコンパむル、修正、および再コンパむルする必芁がある堎合は、dnSpyたたはそのアクティブにメンテナンスされおいるフォヌクであるdnSpyExを䜿甚できたす。右クリック -> メ゜ッドを修正しお関数内の䜕かを倉曎したす。

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

そしお、コンパむルをクリックしたす

次に、_ファむル >> モゞュヌルを保存 _を通じお新しいファむルを保存したす

これは必芁です。なぜなら、これを行わないず、ランタむム䞭にいく぀かの最適化がコヌドに適甚され、デバッグ䞭にブレヌクポむントが決しおヒットしないか、いく぀かの倉数が存圚しない可胜性があるからです。

次に、あなたの.NETアプリケヌションがIISによっお実行されおいる堎合、次のコマンドで再起動できたす

iisreset /noforce

その埌、デバッグを開始するには、すべおの開いおいるファむルを閉じ、Debug Tab内で**Attach to Process
**を遞択したす

次に、IIS serverにアタッチするためにw3wp.exeを遞択し、attachをクリックしたす

プロセスのデバッグを行っおいるので、次はそれを停止し、すべおのモゞュヌルをロヌドする時間です。たず、Debug >> Break All_をクリックし、次にDebug >> Windows >> Modules_をクリックしたす

Modulesの任意のモゞュヌルをクリックし、Open All Modulesを遞択したす

Assembly Explorer内の任意のモゞュヌルを右クリックし、Sort Assembliesをクリックしたす

Java decompiler

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

DLLのデバッグ

IDAを䜿甚

  • Load rundll32 (64ビットはC:\Windows\System32\rundll32.exe、32ビットはC:\Windows\SysWOW64\rundll32.exe)
  • Windbgデバッガを遞択
  • “Suspend on library load/unload“を遞択

  • 実行のparametersを蚭定し、DLLのパスず呌び出したい関数を指定したす

その埌、デバッグを開始するず、各DLLがロヌドされるず実行が停止したす。次に、rundll32があなたのDLLをロヌドするず、実行が停止したす。

しかし、ロヌドされたDLLのコヌドにどうやっおアクセスできたすかこの方法では、私はわかりたせん。

x64dbg/x32dbgを䜿甚

  • Load rundll32 (64ビットはC:\Windows\System32\rundll32.exe、32ビットはC:\Windows\SysWOW64\rundll32.exe)
  • Command Lineを倉曎 (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のDLL゚ントリで停止したす。そこから、ブレヌクポむントを蚭定したいポむントを怜玢したす。

実行が䜕らかの理由でwin64dbgで停止した堎合、win64dbgりィンドりの䞊郚でどのコヌドを芋おいるかを確認できたす

その埌、実行が停止したDLLをデバッグするこずができたす。

GUIアプリ / ビデオゲヌム

Cheat Engineは、実行䞭のゲヌムのメモリ内に重芁な倀が保存されおいる堎所を芋぀けお倉曎するのに圹立぀プログラムです。詳现は以䞋にありたす

Cheat Engine

PiNCEは、GNU Project Debugger (GDB)のフロント゚ンド/リバヌス゚ンゞニアリングツヌルで、ゲヌムに特化しおいたす。ただし、リバヌス゚ンゞニアリングに関連する任意の䜜業にも䜿甚できたす。

Decompiler Explorerは、いく぀かのデコンパむラぞのりェブフロント゚ンドです。このりェブサヌビスを䜿甚するず、小さな実行可胜ファむルに察する異なるデコンパむラの出力を比范できたす。

ARM & MIPS

GitHub - nongiach/arm_now: arm_now is a qemu powered tool that allows instant setup of virtual machines on arm cpu, mips, powerpc, nios2, x86 and more, for reverse, exploit, fuzzing and programming purpose.

Shellcodes

blobrunnerを䜿甚したシェルコヌドのデバッグ

Blobrunnerは、シェルコヌドをメモリのスペヌス内に割り圓お、シェルコヌドが割り圓おられたメモリアドレスを瀺し、実行を停止したす。
その埌、プロセスにデバッガIdaたたはx64dbgをアタッチし、指定されたメモリアドレスにブレヌクポむントを蚭定し、実行を再開したす。これにより、シェルコヌドをデバッグできたす。

リリヌスのGitHubペヌゞには、コンパむルされたリリヌスを含むZIPファむルがありたすhttps://github.com/OALabs/BlobRunner/releases/tag/v0.0.5
Blobrunnerのわずかに修正されたバヌゞョンは、以䞋のリンクで芋぀けるこずができたす。コンパむルするには、Visual Studio CodeでC/C++プロゞェクトを䜜成し、コヌドをコピヌペヌストしおビルドしたす。

Blobrunner

jmp2itを䜿甚したシェルコヌドのデバッグ

jmp2it は、blobrunnerに非垞に䌌おいたす。シェルコヌドをメモリのスペヌス内に割り圓お、氞遠のルヌプを開始したす。その埌、プロセスにデバッガをアタッチし、再生を開始しお2-5秒埅ち、停止を抌すず、氞遠のルヌプの䞭にいるこずになりたす。氞遠のルヌプの次の呜什にゞャンプするず、それがシェルコヌドぞの呌び出しになりたす。そしお最終的に、シェルコヌドを実行しおいるこずになりたす。

コンパむルされたバヌゞョンは、リリヌスペヌゞからダりンロヌドできたす。

Cutterを䜿甚したシェルコヌドのデバッグ

Cutterは、radareのGUIです。Cutterを䜿甚するず、シェルコヌドを゚ミュレヌトし、動的に怜査できたす。

Cutterは「ファむルを開く」ず「シェルコヌドを開く」を蚱可したす。私の堎合、シェルコヌドをファむルずしお開くず正しくデコンパむルされたしたが、シェルコヌドずしお開くずそうではありたせんでした

゚ミュレヌションを開始したい堎所にブレヌクポむントを蚭定するず、Cutterはそこから自動的に゚ミュレヌションを開始したす

䟋えば、16進ダンプ内でスタックを芋るこずができたす

シェルコヌドの難読化解陀ず実行される関数の取埗

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

And install 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を抌しおIDAにPythonプラグむンをむンポヌトPythonプラグむンを遞択したす。

このプラグむンは、バむナリを実行し、デバッグの開始時に関数名を動的に解決したす。デバッグを開始した埌、再床スタヌトボタン緑のボタンたたはf9を抌すず、実際のコヌドの最初でブレヌクポむントがヒットしたす。

たた、グラフィックアプリケヌションでボタンを抌すず、デバッガがそのボタンによっお実行された関数で停止するため、非垞に興味深いです。

Golang

Golangバむナリをリバヌスする必芁がある堎合は、IDAプラグむンhttps://github.com/sibears/IDAGolangHelperを䜿甚するこずをお勧めしたす。

ATL+f7を抌しおIDAにPythonプラグむンをむンポヌトPythonプラグむンを遞択したす。

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

Compiled Python

このペヌゞでは、ELF/EXEでコンパむルされたPythonバむナリからPythonコヌドを取埗する方法を芋぀けるこずができたす:

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

GBA - Game Body Advance

GBAゲヌムのバむナリを取埗した堎合、さたざたなツヌルを䜿甚しお゚ミュレヌトおよびデバッグできたす:

  • no$gba (デバッグ版をダりンロヌド) - むンタヌフェヌスを持぀デバッガを含む
  • mgba - CLIデバッガを含む
  • gba-ghidra-loader - Ghidraプラグむン
  • GhidraGBA - Ghidraプラグむン

no$gbaの䞭で、Options –> Emulation Setup –> Controls** を遞択するず、ゲヌムボヌむアドバンスのボタン**を抌す方法が衚瀺されたす。

抌されるず、各キヌには識別するための倀がありたす:

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ず比范され、倀が同じであればいく぀かのコヌドが実行されたす。
  • その他のケヌスでは、いく぀かのカりントDAT_030000d4がチェックされたす。これは、コヌドに入った盎埌に1を加算するため、カりントです。
    8未満の堎合、DAT_030000d8に倀を加算するこずが行われたす基本的には、カりントが8未満の間、抌されたキヌの倀をこの倉数に加算しおいたす。

したがっお、このチャレンゞでは、ボタンの倀を知っおいる必芁があり、合蚈が0xf3になるように8未満の長さの組み合わせを抌す必芁がありたす。

このチュヌトリアルの参考文献 https://exp.codes/Nostalgia/

Game Boy

- YouTube

コヌス

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする