실습 개요
OS 보안 과제로 Immunity Debugger를 사용하여 CrackMe 시리즈(abex CrackMe)를 분석하고 시리얼 키 검사 로직을 우회하는 리버싱 실습을 진행했습니다. x86 어셈블리의 조건 분기 명령어를 직접 수정해 프로그램 흐름을 제어합니다.
사용 도구
| 도구 | 용도 |
|---|---|
| Immunity Debugger 1.85 | x86 디버거 - 어셈블리 분석, 브레이크포인트, 런타임 수정 |
| abex CrackMe 시리즈 | 리버싱 입문용 크랙미 문제 모음 (1~8번) |
핵심 개념 - x86 조건 분기 명령어
| 명령어 | 의미 | 조건 |
|---|---|---|
| JE / JZ | Jump if Equal / Zero | ZF = 1 (같으면 점프) |
| JNE / JNZ | Jump if Not Equal / Not Zero | ZF = 0 (다르면 점프) |
| JG | Jump if Greater | ZF=0 AND SF=OF |
| JL | Jump if Less | SF <> OF |
CMP 명령어로 두 값을 비교한 뒤 ZF(Zero Flag) 등을 설정하고, JE/JNE 분기로 성공/실패 경로를 결정합니다. 조건 분기 명령어를 반대로 바꾸면(JE↔JNE) 성공/실패 경로가 역전됩니다.
Immunity Debugger 기본 사용법
실행 및 파일 열기
1. Immunity Debugger 실행
2. File → Open → 분석할 .exe 파일 선택
3. F9: 실행 (Run)
4. F8: Step Over (한 줄씩 실행)
5. F7: Step Into (함수 내부 진입)
문자열로 진입점 찾기 (핵심 기법)
1. 메뉴: Search for → All referenced text strings
(또는 마우스 우클릭 → Search for → All referenced text strings)
2. 성공/실패 메시지 문자열 검색
예: "Yep, this key is right!", "Wrong!"
3. 해당 문자열에서 더블클릭 → 코드 해당 위치로 이동
4. 주변 CMP, JE, JNE 명령어 분석
어셈블리 명령어 수정
1. 수정할 명령어에 커서 위치
2. 스페이스바 또는 Assemble 클릭
3. 새 명령어 입력 후 Assemble
예: JE → JNE, JNZ → JZ, AND → OR
문제 3 - abex CrackMe #2 (이중 시리얼 검사 우회)
파일: quiz3_abexcm2.exe
목표: 이름(Name)과 시리얼 번호(Serial)를 입력하면 시리얼이 맞는지 검사하는 프로그램을 크랙하기
분석 과정
1단계 - 문자열로 진입점 찾기
Immunity Debugger에서 All referenced text strings를 열면 다음 문자열이 보입니다:
"Yep, this key is right!" ← 성공 메시지
"Nope, this is wrong!" ← 실패 메시지
"Yep, this key is right!" 더블클릭 → 해당 코드 영역으로 이동
2단계 - 조건 분기 분석
진입점 위 코드를 보면 다음 구조를 확인할 수 있습니다:
; 시리얼 비교 로직
CMP EAX, ECX ; 입력값 vs 계산값 비교
JE [성공 경로] ; ← 핵심 분기: 같으면 성공으로 점프
[실패 처리]
...
[성공 처리]
"Yep, this key is right!"
구조를 보면 아마 다음과 같은 C 코드로 작성되었을 것입니다:
if (serial1 == correct1) {
// 1차 검사 통과
if (serial2 == correct2) {
MessageBox("Yep, this key is right!");
}
}
MessageBox("Nope, this is wrong!");
3단계 - 1차 JE → JNE 변환
첫 번째 JE를 JNE(JNZ)로 변경하고 실행하면:
결과 1: 키가 올바르지 않을 때 축하 메시지 출력
→ 성공!? 하지만 바로 다음에 또 실패 메시지가 뜸
시리얼 키를 2번 검사하는 구조임을 확인! 마치:
if (a == b) { return a; } // 1차 검사
if (b == c) { return c; } // 2차 검사
4단계 - 2차 JE도 JNE로 변환
두 번째 JE도 JNE로 바꾸고 실행하면:
결과: 어떤 값을 입력해도 "Yep, this key is right!" 메시지만 출력
→ 크랙 성공!
핵심 포인트
- 프로그램이 시리얼을 2번 검사하는 구조였음
- JE를 하나만 바꾸면 반쪽짜리 성공 → 두 분기 모두 변경 필요
- 문자열 탐색으로 진입점을 찾는 것이 핵심 기법
문제 6 - Crack me by hackereh (AND 조건 우회)
파일: quiz6_Crack me by hackereh@!.exe
목표: 시리얼 키 검사를 우회하여 "Yup, you did it! Now make a tutorial" 메시지 출력
분석 과정
1단계 - 문자열로 진입점 찾기
문자열: "Yup, you did it! Now make a tutorial"
이 문자열에서 진입점을 찾으면 스크롤을 살짝 올리면 바로 검사 로직이 보입니다.
2단계 - 조건 분기 분석
코드를 보면 다음과 같은 구조가 나타납니다:
; 입력 여부 검사
TEST EAX, EAX
JE [입력없음 처리] ← 빈 입력 체크 (건드리지 않음)
; 시리얼 검사 (여러 조건)
CMP [값1], 어떤값
JNZ [실패]
CMP [값2], 어떤값
JNZ [실패]
CMP [값3], 어떤값
JNZ [실패]
...
AND [조건들]
AND [조건들]
...
[성공] "Yup, you did it!"
예상 소스 구조:
if (input == "") {
// 입력 없음 처리 ← 건드리지 않음
} else if (check1 && check2 && check3) {
success();
}
3단계 - 1차 시도: JNZ → JZ 변환
빈 입력 체크 JE는 그대로 두고, 시리얼 검사 영역의 JNZ들을 모두 JZ로 변환해 실행하면:
결과: 아직도 성공하지 않음
→ AND 조건에서 한 번 더 검사하기 때문
4단계 - 2차 시도: AND → OR 변환
JNZ 변환 외에 검사 영역의 AND 명령어를 OR로 변환합니다:
AND EAX, EBX → OR EAX, EBX
AND ECX, EDX → OR ECX, EDX
AND 조건: 모든 조건이 참이어야 성공 (엄격)
OR 조건: 하나만 참이어도 성공 (느슨)
결과: "Yup, you did it! Now make a tutorial" 메시지 출력
→ 크랙 성공!
핵심 포인트
- 분기 명령어(JNZ)뿐만 아니라 AND 조건 명령어도 검사에 사용됨
- JNZ만 바꿔서는 부족 → AND→OR 변환으로 추가 조건 해제
- 빈 입력 체크 JE는 건드리지 않음 (수정 시 프로그램이 이상 동작)
두 문제 비교 정리
| 항목 | 문제 3 (abexcm2) | 문제 6 (hackereh) |
|---|---|---|
| 검사 구조 | 이중 JE 검사 | JNZ + AND 복합 검사 |
| 크랙 방법 | JE → JNE 2회 변환 | JNZ → JZ + AND → OR 변환 |
| 주의 사항 | 두 번째 JE도 반드시 변환 | 빈 입력 체크 JE는 건드리지 않음 |
| 핵심 개념 | 이중 검사 구조 파악 | AND 조건 분기 이해 |
리버싱 기초 흐름 정리
1. 파일을 Immunity Debugger에서 열기
2. Search for → All referenced text strings
(성공/실패 메시지로 진입점 찾기)
3. 진입점 주변 CMP + 분기 명령어 파악
4. 조건 분기 수정:
- JE ↔ JNE (조건 역전)
- JNZ ↔ JZ (조건 역전)
- AND → OR (복합 조건 완화)
5. 실행하여 결과 확인
6. 여전히 실패 시 → 추가 검사 구간 탐색 반복
추가 학습 - abex CrackMe 시리즈 목록
| 번호 | 파일명 | 주요 기법 |
|---|---|---|
| 1 | abexcm1.exe | 하드코딩된 시리얼 탐색 |
| 2 | abexcm5.exe | 알고리즘 기반 시리얼 |
| 3 | abexcm2.exe | 이중 JE 검사 우회 ← 이번 실습 |
| 4 | abexcm3.exe | .l2c 라이센스 파일 분석 |
| 5 | abexcm4.exe | 시간 기반 시리얼 |
| 6 | hackereh.exe | AND→OR 조건 변환 ← 이번 실습 |
| 7 | tots4.exe | 패킹된 실행파일 언패킹 |
| 8 | ReverseMe1.exe | VB(Visual Basic) 리버싱 |