← 목록으로

어셈블리어 읽기 기초 (x86-64)

[Rev] 리버싱 · 작성: 2026-07-19 19:32:50 · 수정: 2026-07-21 23:26:47 · 조회 12

x86-64 어셈블리를 "명령어를 외우는 것"으로 접근하면 금방 지친다. 실제로 리버싱에서 필요한 건 몇 안 되는 패턴 — 함수 프롤로그/에필로그, 분기 조건, 메모리 접근 방식 — 을 눈에 익혀서 어셈블리 덩어리를 "덩어리(청크) 단위"로 읽어내는 능력이다.

레지스터와 AT&T vs Intel 문법

리눅스 도구(objdump, gdb)는 기본이 AT&T 문법(mov %rax, %rbx, 소스가 왼쪽), Windows 도구·IDA·Ghidra는 Intel 문법(mov rbx, rax, 목적지가 왼쪽)을 쓴다. 같은 명령어가 정반대 순서로 보인다는 걸 모르면 완전히 헷갈린다gdb에서 set disassembly-flavor intel로 통일해두는 걸 권장한다.

함수 프롤로그/에필로그 패턴 — 가장 먼저 눈에 익혀야 하는 것

; 프롤로그
push rbp
mov  rbp, rsp
sub  rsp, 0x20      ; 지역 변수용 스택 공간 확보

; ... 함수 본체 ...

; 에필로그
leave               ; mov rsp, rbp; pop rbp 와 동일
ret                 ; 스택의 리턴 주소로 점프

이 패턴이 보이면 "새 함수의 시작/끝"이라는 걸 바로 알아챌 수 있다 — 스택 버퍼 오버플로우 글에서 다룬 리턴 주소 하이재킹이 정확히 이 ret 명령어를 겨냥한다는 걸 여기서 다시 확인할 수 있다.

자주 보는 명령어 유형별로 묶어서 읽기

크랙미에서 실제로 반복되는 패턴: 인증 로직 찾기

cmp eax, 0x1337     ; 사용자 입력(eax)과 정답을 비교
jne fail            ; 다르면 fail로 점프
; 여기 도달하면 "성공" 분기

크랙미나 라이선스 체크 로직을 리버싱할 때는 결국 이런 cmp+조건부 점프 패턴을 찾아서, 그 직전에 비교 대상이 어떻게 계산됐는지(입력값을 어떤 알고리즘으로 변환한 결과인지)를 거슬러 올라가는 작업이 핵심이다 — 크랙미 실습 방법론 글에서 이 접근을 실전 단계로 정리한다.

여기서 끝나지 않는다

어셈블리를 "명령어 하나하나의 의미"가 아니라 "프롤로그/에필로그로 함수 경계를 찾고, cmp+jcc 짝으로 분기 로직을 찾는" 패턴 인식으로 접근하면, 처음 보는 바이너리도 훨씬 빠르게 구조가 잡힌다.

리버싱 카테고리의 글 (2/11)

  1. 리버싱이란 무엇인가: 정적 분석 기초
  2. 어셈블리어 읽기 기초 (x86-64)
  3. 동적 분석: 디버거로 실행 흐름 추적하기
  4. 안티 디버깅 / 안티 리버싱 기법과 우회
  5. 패킹과 언패킹: 실행 파일을 압축/암호화해서 숨기기
  6. Frida로 동적 계측/후킹하기
  7. 안드로이드 앱 리버싱: APK 분석 기초
  8. iOS 앱 리버싱 기초
  9. 크랙미(Crackme) 실습 방법론
  10. PE 포맷 내부 구조: Windows 실행 파일 뜯어보기
  11. 코드 난독화 해제: Control Flow Flattening 분석하기
← 리버싱이란 무엇인가: 정적 분석 기초 동적 분석: 디버거로 실행 흐름 추적하기 →