0Pricing
Cyber Security Academy · レッスン

リバースエンジニアリングのための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)。

  1. RDI
  2. RSI
  3. RDX
  4. RCX
  5. R8
  6. 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 handler

SIMDと暗号の定数

アルゴリズムを特定できる数値定数を探します。

  • 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Ghidra:バイナリの操作と注釈付け
  2. リバースエンジニアリングのためのx86/x64アセンブリ基礎
  3. GDBとpwndbgによる動的解析
  4. 難読化解除とアンチ解析技法
← Cyber Security Academyに戻る