본문 바로가기

勉強/Reversing

OS보안 - Immunity Debugger로 CrackMe 리버싱 실습 (JE 조건 역전, AND→OR 변환으로 시리얼 키 우회)

실습 개요

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) 리버싱

undefined