リバースエンジニアリングのためのx86/x64アセンブリ基礎
MOV、CMP、JNE、CALL、RETを読み、レジスターとスタックを通じてデータフローを追跡します。
「リバースエンジニアリングのためのx86/x64アセンブリ基礎」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。
リバースエンジニアにアセンブリが必要な理由
Ghidraのデコンパイラは便利ですが、完全ではありません。一部の構造を見落としたり、型を誤って推測したり、難読化されたコードをデコンパイルできなかったりします。アセンブリを直接読むことで、正確な事実を確認できます。リバースエンジニアに必要なのは、アセンブリを書くことではなく読むことです。
レジスタ
x86-64の主要なレジスタ:
- RAX — アキュムレータ、戻り値
- RBX、RCX、RDX — 汎用レジスタ
- RSI、RDI — ソース/デスティネーションインデックス、第1/第2関数引数
- RSP — スタックポインタ
- RBP — ベースポインタ(スタックフレーム)
- RIP — 命令ポインタ
関数呼び出し規約(x64 Linux)
引数はレジスタで渡されます(System V AMD64 ABI)。
- RDI
- RSI
- RDX
- RCX
- R8
- R9
戻り値はRAXに格納されます。追加の引数はスタックに積まれます。
基本的な命令
まず覚えておきたい基本命令は次のとおりです。
mov rax, rbx ; copy rbx to rax
push rax ; push rax onto stack
pop rbx ; pop top of stack into rbx
add rax, 8 ; rax = rax + 8
sub rsp, 0x20 ; allocate 32 bytes on stack
call 0x401234 ; call function at address
ret ; return to caller
lea rax, [rbp-0x10] ; load address of local var条件分岐
比較と分岐について確認します。
cmp rax, 0 ; set flags based on rax - 0
test rax, rax ; test rax & rax (check if zero)
jz 0x401234 ; jump if zero
jnz 0x401234 ; jump if not zero
jl 0x401234 ; jump if less (signed)
jge 0x401234 ; jump if >= (signed)
je 0x401234 ; jump if equal単純な関数の読み方
よくあるパターンを見分けます。
; if (x == 0) return 1;
mov eax, [rbp-4] ; load x
test eax, eax ; x == 0?
jnz .notZero ; if not zero, skip
mov eax, 1 ; return value = 1
ret
.notZero:
...文字列操作の見分け方
よく使われる文字列/メモリ操作は次のとおりです。
; memcpy(dest, src, n):
; rdi=dest, rsi=src, rdx=n
rep movsb ; copy RCX bytes from RSI to RDI
; strlen-like loop:
.loop:
cmp byte [rsi], 0 ; check for null terminator
je .done
inc rsi
jmp .loopスタックフレームのセットアップと破棄
すべての関数は、次の処理で始まり、終わります。
; Prologue:
push rbp ; save caller frame
mov rbp, rsp ; set up new frame
sub rsp, 0x30 ; allocate local vars
; Epilogue:
leave ; mov rsp, rbp; pop rbp
retループの特定
逆アセンブリでのループは、次のように見分けられます。
- 後方(低いアドレス)へのジャンプは、ループを示します
- レジスタ内のカウンタが
dec/subでデクリメントされます loop命令はRCXをデクリメントし、ゼロでなければジャンプします
switch文の読み方
switch文は、多くの場合ジャンプテーブルにコンパイルされます。
; Jump table pattern:
cmp eax, 5 ; check if case > max
ja .default ; jump to default
lea rcx, [jump_table]
mov rax, [rcx + rax*8] ; index into table
jmp rax ; jump to case handlerSIMDと暗号の定数
アルゴリズムを特定できる数値定数を探します。
- AESのS-box:先頭バイトは
63 7C 77 7B... - SHA-256の初期ハッシュ:
0x6a09e667, 0xbb67ae85... - MD5:
0xd76aa478
これらの定数を見分ければ、暗号関数をすぐに特定できます。
x64アセンブリのクイックチェック
x86-64のSystem V ABIでは、関数呼び出しの第1引数を保持するレジスタはどれですか。
レッスンのまとめ
x86-64のリバースには、主要なレジスタ(RAX、RDI、RSI、RSP、RIP)、関数呼び出し規約(引数はRDI/RSI/RDX…)、一般的なパターン(プロローグ、ループ、比較、ジャンプテーブル)に関する知識が必要です。アセンブリを書く必要はなく、読めれば十分です。コード内の暗号定数から、バイナリを実行せずにアルゴリズムを特定できます。
よくある質問
「リバースエンジニアリングのためのx86/x64アセンブリ基礎」レッスンは無料ですか?
はい。「リバースエンジニアリングのためのx86/x64アセンブリ基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。
「リバースエンジニアリングのためのx86/x64アセンブリ基礎」で何を学びますか?
MOV、CMP、JNE、CALL、RETを読み、レジスターとスタックを通じてデータフローを追跡します。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cyber Security Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「リバースエンジニアリングのためのx86/x64アセンブリ基礎」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCyber Security Academyレッスンでコードを書いて実行できますか?
はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Ghidra:バイナリの操作と注釈付け
- リバースエンジニアリングのためのx86/x64アセンブリ基礎
- GDBとpwndbgによる動的解析
- 難読化解除とアンチ解析技法