Without a Break

crackme#1 본문

Reversing/Wargame

crackme#1

와븨 2024. 3. 29. 17:51

 

crackme#1을 실행하면 위와 같은 팝업창이 순서대로 뜬다.

실행하면 실패 문자열 "Nah... This is not  a CD-ROM Drive!"이 뜨는데, 이를 성공 문자열로 바꾸는 게 이번 문제다.

 

 


*어셈블리 명령어 참고

명령어 설명
PUSH 스택의 값을 입력
CALL 지정된 주소의 함수를 호출
INC 값을 1 증가
DEC 값을 1 감소
JMP 지정된 주소로 점프
CMP 주어진 두개의 operand 비교
- Sub 명령어와 동일하나 operand 값이 변경되지 않고 EFLAGS 레지스터만 변경됨 (두 operand의 값이 동일하다면 SUB 결과는 0이고 ZF=1로 세팅됨)
JE 조건 분기(Jump if equal)
- ZF=1이면 점프

 

디버거로 실행 파일을 열면 위와 같이 뜬다.

 

실행 흐름은 다음과 같다.

  • GetDriveTypeA()
    • 리턴 값(EAX) = 3(DRIVE_FIXED)
    • ESI = 0
    • EAX = 2
    • ESI = 1
    • ESI = 2
    • EAX = 1
  • 조건분기
    • EAX(1)와 ESI(2)를 비교
    • JE(Jump if Equal) 조건 분기 명령 : 두 값이 같으면 40103D(Ok 문자열)로 점프하고, 다르면 401028(Nah 문자열)을 진행
  • 실패 MessageBoxA() 호출
    • 00401028
  • 성공 MessageBoxA() 호출
    • 0040103D
  • ExitProcess
    • 프로세스 종료
  • API 호출

실행 흐름을 보아, 성공 MessageBoxA()의 위치인 40103D로 이동하도록 조건 분기를 수정하면 된다는 것을 알 수 있다.

 


[문제 풀이]

 

1. 조건 분기 실행 전에 성공 MessageBoxA()로 점프

EAX의 값을 비교하기 전에 JMP를 사용해 OK를 출력하는 MessageBoxB 함수로 이동하도록 코드를 수정하면

 

 

EAX의 값이 같지 않아도 Ok가 뜨게 된다.

 

 

2. 조건 분기 JE를 JMP로 수정

JE (값 비교)를 JMP (해당 위치로 점프) 로 바꿔 성공 문자열이 뜨도록 한다.

 

'Reversing > Wargame' 카테고리의 다른 글

crackme #4  (0) 2024.04.01
[CodeEngn] Advance RCE L02  (0) 2023.08.23
[Dreamhack] rev-basic-7  (0) 2023.08.23
[Dreamhack] rev-basic-5  (0) 2023.08.23
[CodeEngn] Advance RCE L05  (0) 2023.08.23