본문 바로가기
Reversing/abex' crackme

abex' crackme #1

by 09337 2021. 1. 18.

※ 공부 기록용이라 설명이 친절하지 않음

 

 

네 HD가 CD-Rom 이라고 생각하게 해라.

 

이건 CD-ROM Drive가 아니야!

 

 

OllyDbg로 열어본다.

 

abex' crackme #1

 

00401000~0040100E

PUSH 4번 후, USER32를 호출한다. 처음 봤던 메시지 박스의 내용이 적혀있다. [PUSH], [CALL]

 

00401013~00401018

PUSH 1번 후, KERNEL32를 호출한다. 두 번째로 봤던 메시지 박스 내용이 보인다. [PUSH], [CALL]

 

0040101D~0040101E

ESI에 1을 더하고 EAX에 1을 뺀다. [INC], [DEC]

 

0040101F

00401021로 이동한다. [JMP]

 

00401021~00401023

ESI에 1을 두 번 더하고, EAX에 1을 뺀다. [INC], [DEC]

 

00401024

EAX와 ESI를 비교한다. [CMP]

 

00401026

조건문이 같으면 0040103D로 점프한다. 즉, 앞서 나온 CMP EAX,ESI가 조건이 되어, EAX와 ESI가 같으면 점프한다.

 

1) 조건을 만족할 때

: 0040103D로 점프한다.

 

0040103D~0040104B

PUSH 4번 후, USER32를 호출한다. 마찬가지로 처음 봤던 메시지 박스의 내용이 적혀있다. [PUSH], [CALL]

 

00401050

KERNEL32를 호출하고 프로세스를 종료한다. [CALL]

 

2) 조건을 만족하지 못할 때

: 다음 주소로 이어진다.

 

00401028~00401036

PUSH 4번 후, USER32를 호출한다. 마찬가지로 처음 봤던 메시지 박스의 내용이 적혀있다. [PUSH], [CALL]

 

0040103B

00401050으로 점프한다. [JMP]

 

00401050

KERNEL32를 호출하고 프로세스를 종료한다. [CALL]

 

 

 

문제를 해결하기 위해서는 이 부분(아래 접은글)의 조건이 일치해서 0040103D로 점프해야 한다.

더보기

00401024
EAX와 ESI를 비교한다. [CMP]

00401026
조건문이 같으면 0040103D로 점프한다. 즉, 앞서 나온 CMP EAX,ESI가 조건이 되어, EAX와 ESI가 같으면 점프한다.

 

문제를 해결하기 위한 방법은 세 가지를 생각할 수 있었다.

1. 어셈블리어를 변경: JE > JMP

이렇게 변경하면, 조건을 보지 않고 무조건 이동하게 된다.

 

2. 어셈블리어를 변경: JE > JNE

JE는 조건이 일치할 때라면, JNE는 조건이 일치하지 않을 때 점프한다. EAX와 ESI의 값이 일치하지 않다는 것을 이용하여, 일치하지 않을 때 이동하도록 변경해준다.

 

3. 조건을 변경: CMP EAX,ESI > CMP EAX,EAX

두 개를 비교했을 때 값이 다를 수 없으므로 JE가 실행된다.

 

 

수정한 후, 확인해보면 원하는 메시지가 출력된다.

 

 

 

 

어셈블리어 정리

PUSH : 스택에 값을 저장

CALL : 지정된 주소의 함수 호출

INC : 값을 1 증가

DEC : 값을 1 감소

JMP : 지정된 주소로 점프

CMP : 주어진 두 값을 비교 //혼자 쓰이는 경우는 없고, 뒤에 JMP 같은 명령어가 같이 쓰인다.

JE : 조건 분기, ZF=1이면 점프 //분기문, 조건문들이 이루어진다. (ZF: 제로 플래그(Zero Flag) 연산 결과가 0이면 참(1))

 

 

JE, JNE 외에도 다양한 점프 명령어가 존재한다. 이건 나중에 공부하기로..

 

 

글에 오류가 있다면 지적해주세요.... 어셈블리어 처음이라 모르는 거 多

댓글