lhywk 님의 블로그

[Reversing.kr] Easy Crack 본문

Reversing/Reversing.kr

[Reversing.kr] Easy Crack

lhywk 2026. 1. 4. 20:47

문제 풀이

바이너리 실행

해당 바이너리를 실행해 보면 알맞지 않을 값을 넣었을 시 Incoreect Password라는 MessageBox를 띄웁니다.

 

1. 정적 분석

먼저 IDA를 통해 코드 구조를 살펴보겠습니다.

strings 확인

먼저 아까 봤던 Incorrect Password 문자열을 확인합니다.

Congratulation이라는 문자열을 보니 정확한 값을 입력하면 저 문자열을 출력합니다.

main 디컴파일

해당 문자열을 참조하는 곳을 가서 디컴파일 해봤습니다.

if 문 조건을 만족할 시 Congratulation, 아니면 Incorrect Password 메시지 박스 출력입니다.

이제는 동적 분석을 진행해 보겠습니다.

 

2. 동적 분석

 

문자열이 있는 곳을 전부 중단점을 걸겠습니다.

user32 dll에서 로드한 함수도 전부 중단점을 걸어 보겠습니다.

f9로 런하고 입력 란이 나오면 아무 값(0123456789)이나 입력해 보겠습니다.

jcc 명령어들이 많이 보이고 하단에 Congratulation 문구도 보이니 이 어셈블리를 분석해보겠습니다.

해당 어셈블리를 보겠습니다.

cmp [esp+5], 61입니다. 그 후 jne가 만족하면 401135로 분기하고 있습니다.

401135 주소는 실패 지점입니다. 그럼 esp+5 값을 보겠습니다.

esp+4부터 esp + D까지 입력값 0123456789가 저장되어 있습니다.

esp+5 값은 1 위치입니다.

0a23456789라는 것을 알 수 있습니다.

플래그 우회

분석을 하기 위해 앞으로 조건이 맞지 않을 시 ZF 플래그를 강제 조작하여 분석을 진행하겠습니다.

그다음 줄을 보면

push 2 : 2를 스택에 푸시 -4바이트

lea ecx, [esp+A] : esp + A는 그렇다면 0a23456789 중 2를 가리킴 그 주소를 ecx에 저장

push easy_crackme.406058 : 5y 가 저장되어 있는 주소 저장

push ecx : 2를 가리키는 주소를 스택에 저장

call easy_crackme.401150 : 401150 주소에 있는 함수 호출

401150로 호출한 함수는 IDA를 통해 볼 때 strncmp 함수입니다.

strncmp 함수의 호출 규약은 다음과 같습니다.

strncmp 구조

그렇다면

push 2

push easy_crackme.406058

push ecx

이렇게가 3개의 인자를 구성합니다.

str1은 2를 가리키고 있는 주소

str2는 5y를 가리키고 있는 주소

size는 2가 됩니다.

결국 23과 5y를 비교한다는 것을 알 수 있습니다.

0a5y456789까지 알아냈습니다.

다음 어셈블리를 살펴보겠습니다.

mov esi, easy_crackme.40606C : R3versing 문자열이 있는 주소를 esi에 복사

lea eax, [esp+10] : 0a5y456789 입력값에서 4 입력값의 주소를 eax에 저장

mov dl, [eax] : eax의 1바이트 값을 dl에 복사

mov bl, [esi] : esi의 1바이트 값을 bl에 복사

mov cl, dl : dl의 값을 cl에 복사

cmp dl, bl : 4와 R을 비교

jne easy_crackme.401102 : 같지 않다면 401102로 분기

이 분석을 통해 0a5yR56789까지 알아냈습니다.

test cl, cl : cl의 값을 and 연산

je easy_crackme.4010FE : 우리의 값은 0이 아니기 때문에 다음으로 내려갑니다.

mov dl, [eax+1] : 5를 dl에 복사

mov bl, [esi+1] : 3을 bl에 복사

mov cl, dl : dl의 값을 cl에 복사

cmp dl, bl : 5와 3을 비교

jne easy_crackme.401102 : 같지 않다면 401102로 분기

이 분석을 통해 0a5yR36789까지 알아냈습니다.

add eax + 2 : eax에 2를 더함 (6을 가리킴)

add esi + 2 : esi에 2를 더함(v을 가리킴)

test cl, cl : cl을 and 연산

jne easy_crackme.4010DA : 이전 test 연산의 값이 0이 아니므로 4010DA 주소로 분기

여기까지 구조를 보면 계속 2개의 문자열씩 우리의 입력값과 반복해서 검증하고 있다는 것을 알 수 있습니다.

그렇다면 이 이후의 값은 0a5yR3versing이 되겠습니다. 이제는 앞 문자만 알아내면 됩니다.

cmp [esp+4], 45 : esp+4(0) 값을 E와 비교

jne easy_crackme.401135 : 같지 않다면 실패지점으로 분기

정답은 Ea5yR3versing이 되겠습니다.

 

'Reversing > Reversing.kr' 카테고리의 다른 글

[Reversing.kr] Replace  (0) 2026.02.04
[Reversing.kr] Easy Keygen  (0) 2026.01.12