리버스 엔지니어링을 위한 x86/x64 어셈블리 핵심
MOV, CMP, JNE, CALL, RET를 읽고 레지스터와 스택을 통한 데이터 흐름을 추적합니다.
리버스 엔지니어링을 위한 x86/x64 어셈블리 핵심은(는) CoddyKit의 무료 Cyber Security Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cyber Security Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cyber Security Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
리버스 엔지니어링에서 어셈블리를 사용하는 이유
Ghidra의 디컴파일러는 유용하지만 완벽하지 않습니다 — 일부 구문을 놓치고, 형식을 잘못 추론하며, 난독화된 코드를 디컴파일하지 못합니다. 어셈블리를 직접 읽으면 정확한 실행 내용을 확인할 수 있습니다. 리버스 엔지니어는 어셈블리를 작성할 필요 없이 읽을 줄 알아야 합니다.
레지스터
x86-64 주요 레지스터:
- RAX — 누산기, 반환 값
- RBX, RCX, RDX — 범용 레지스터
- RSI, RDI — 원본/대상 인덱스, 첫 번째/두 번째 함수 인수
- 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를 감소시키고 0이 아니면 점프합니다
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에서 함수 호출의 첫 번째 인수를 저장하는 레지스터는 무엇인가요?
강의 요약
x86-64 리버스 엔지니어링에는 주요 레지스터(RAX, RDI, RSI, RSP, RIP), 함수 호출 규약(RDI/RSI/RDX 등에 인수 전달), 일반적인 패턴(프롤로그, 반복문, 비교, 점프 테이블)을 아는 것이 필요합니다. 어셈블리를 작성할 필요는 없고 읽기만 하면 됩니다. 코드에 있는 암호 상수를 통해 바이너리를 실행하지 않고도 알고리즘을 식별할 수 있습니다.
자주 묻는 질문
“리버스 엔지니어링을 위한 x86/x64 어셈블리 핵심” 강의는 무료인가요?
네 — “리버스 엔지니어링을 위한 x86/x64 어셈블리 핵심” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cyber Security Academy 강의 전체를 잠금 해제할 수 있습니다. Cyber Security Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“리버스 엔지니어링을 위한 x86/x64 어셈블리 핵심”에서 뭘 배우나요?
MOV, CMP, JNE, CALL, RET를 읽고 레지스터와 스택을 통한 데이터 흐름을 추적합니다. 브라우저에서 직접 실행하는 실습 코드로 Cyber Security Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cyber Security Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cyber Security Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“리버스 엔지니어링을 위한 x86/x64 어셈블리 핵심” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cyber Security Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cyber Security Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Ghidra: 바이너리 탐색과 주석 작성
- 리버스 엔지니어링을 위한 x86/x64 어셈블리 핵심
- GDB와 pwndbg를 사용한 동적 분석
- 난독화 해제와 분석 방해 기법