정현진Jeong Hyeonjin

정현진 — 보안 포트폴리오

Research / 리버싱 / abex crackme 1·2: OllyDbg로 분기, 스택, 메모리 값을 바꿔 보기

abex crackme 1·2: OllyDbg로 분기, 스택, 메모리 값을 바꿔 보기

유형
연구 기록
분류
리버싱
발행
2025. 9. 4.
분량
2분
종류
연구 기록

CD-ROM 검사를 점프 하나로 우회하고, 일련번호 검사에서는 스택과 메모리에 들어 있는 값을 직접 고쳐 결과를 바꿨습니다.

OllyDbg 사용법을 익히려고 abex crackme 1, 2번을 풀면서 정리했습니다. 문제를 푸는 것보다 디버거로 무엇을 바꿀 수 있는지를 확인하는 데 목적이 있었습니다.

OllyDbg 기본 조작

기능 키 설명
스텝 오버 F8 한 줄씩 실행. CALL은 안으로 들어가지 않음
스텝 인투 F7 한 줄씩 실행. CALL이면 그 함수 안으로 들어감
브레이크포인트 F2 그 명령에서 실행을 멈춤
실행 F9 다음 브레이크포인트까지 실행
다시 시작 Ctrl+F12 처음부터 다시
브레이크포인트 목록 Alt+B 설정한 위치 확인

F2로 거는 소프트웨어 브레이크포인트는 명령의 첫 1바이트를 0xCC(INT 3)로 바꿔 둡니다. 그 명령에 도달하면 인터럽트가 나서 멈춥니다.

crackme 1: CD-ROM이 아니면 실패

실행하면 "하드디스크를 CD-ROM으로 인식하게 만들라"는 메시지가 나옵니다.

흐름

  1. GetDriveTypeA()로 드라이브 종류를 가져옵니다. 하드디스크면 3이 돌아옵니다.
  2. INC ESI, DEC EAX 같은 명령으로 값을 조정합니다.
  3. CMP EAX, ESI로 비교하고, 같으면(ZF=1) JE로 성공 메시지 쪽으로 갑니다.
  4. 하드디스크라서 두 값이 다르고, ZF=0이 되어 실패 메시지가 나옵니다.

푼 방법 두 가지

  • 코드 수정: JE를 무조건 점프 JMP로 바꿔 항상 성공 메시지로 가게 했습니다.
  • 플래그 수정: 비교문까지 실행한 뒤, 레지스터 창의 ZF를 더블클릭해 0을 1로 바꿨습니다.

MessageBox와 스택 프레임

성공·실패 메시지는 MessageBoxA()로 띄웁니다. 인자는 4개입니다 (소유 창 핸들, 메시지, 제목, 버튼·동작). 문자열 인자는 00(NULL)이 나올 때까지 이어서 읽습니다.

F7로 MessageBoxA 안에 들어가 스택을 보면, 인자 4개 → 복귀 주소 → 이전 EBP 순서로 쌓여 있습니다. 함수 끝의 RETN 10은 복귀하면서 인자 16바이트(4개 × 4바이트)만큼 ESP를 올려 스택을 정리합니다.

crackme 2: 이름으로 만든 일련번호

이름과 일련번호를 입력받아, 이름으로 계산한 일련번호와 같은지 확인합니다. 이름이 4글자보다 짧으면 오류가 납니다.

문자열 검색으로 시작점 찾기

  1. 코드 영역 우클릭 → [Search for] → [All referenced strings]
  2. "Please enter at least 4 chars as name!" 같은 문자열을 찾아 [Follow in Disassembler]로 이동
  3. 그 근처에 브레이크포인트를 걸고 실행

디버거 상태가 Running이어야 입력 창에 값을 넣을 수 있습니다.

스택 값 바꾸기

이름에 "ab", 일련번호에 "1234"를 넣고 실행했습니다. 오류 창 제목으로 쓰이는 "Error!" 문자열의 주소(004023D0)가 스택의 EBP-0E4에 들어 있었습니다.

이 값을 다른 문자열 주소(0040237C)로 바꾸면 창 제목이 바뀝니다. 스택 창에서 [Edit] → [Binary edit]로 고칩니다. 스택 주소를 EBP-xx 형태로 보고 싶으면 스택 창 우클릭 → [Addressing] → [Relative to EBP]를 씁니다.

리틀 엔디안

수정 창에서는 00 40 23 D0이 D0 23 40 00으로 보입니다. x86은 리틀 엔디안이라서, 값의 가장 낮은 바이트부터 메모리에 저장하기 때문입니다.

메모리 값 바꾸기

[Follow in Dump]에는 세 가지가 있습니다.

메뉴 보여주는 것
Memory address 그 값이 저장된 메모리 위치
Immediate constant 명령에 쓰인 주소가 가리키는 데이터
Selection 선택한 명령 자체가 있는 위치

004023D0을 Immediate constant로 보면 45 00 72 00 ..., 즉 유니코드 "Error!"가 들어 있습니다. 이 메모리를 아래쪽의 "right!"로 덮어쓰면 오류 창 문구 자체가 바뀝니다.

정답 비교 지점

0040332F의 TEST AX, AX가 정답·오답을 가릅니다. 그 앞에서 EBP-94에 프로그램이 만든 일련번호가 들어가고, 근처에 내가 입력한 "1234"의 주소가 있었습니다.

정리

  • 분기 결과는 명령(JE→JMP) 이나 플래그(ZF) 로 바꿀 수 있습니다.
  • 화면에 나오는 문자열은 스택에 있는 주소나 메모리의 내용을 바꿔서 바꿀 수 있습니다.
  • 출발점은 문자열 검색이었습니다. 프로그램이 출력하는 문구에서 거꾸로 코드를 찾아갔습니다.

0 백링크0 링크3 태그