lhywk 님의 블로그

[실습] crackme2_find_number 본문

Malware Analysis

[실습] crackme2_find_number

lhywk 2026. 7. 9. 13:26

문제 바이너리를 실행한다.

패스워드를 입력하는 란이 나오고 아무 패스워드(12345)를 입력하면 wrong이라는 문자열 출력 후 프로그램을 종료한다.

 

x64디버거로 해당 바이너리를 분석해 본다.

아까 프로그램을 실행했을 때 터미널에 출력된 문자열을 참조하기 위해 따라가 본다.

터미널에서 본 문자열들을 확인할 수 있고 성공했을 때는 correct, good job! :) 명령어가 출력되는 것 같다.

모든 문자열에 중단점을 걸고 실행해 본다.

crackme_find_number.4010C6을 call하고 있는데 특징이 보인다.

문자열을 push하고 call하여 터미널에 찍어내는데 이것은 printf 함수라는 것을 유추해 볼 수 있다.

Enter 입력 후 shift+: 을 하여 레이블을 설정할 수 있고 printf로 등록한다. 그 후 -을 눌러 이 전 명령줄로 돌아온다.

정상적으로 printf 함수 레이블이 등록된 것을 확인할 수 있다.

이제 패턴을 알았으니 401066 이 전까지의 중단점은 해제하고 패스워드 검증 로직을 살펴본다.

add esp, 4 : 직전 push인 printf 인자를 정리한다.

 

lea eax, [ebp-4]: 입력값 저장할 변수 주소 -> eax 저장

push eax: 2번째 인자: &변수

push "%d": 1번째 인자: 포맷 문자열

이 3개의 어셈블리를 보면 우리의 입력값을 저장할 변수 주소와 포맷 문자열을 입력받는다는 것은 scanf 함수로 생각해 볼 수 있다.

call 4010AF: 2개의 인자를 가지고 scanf 함수를 호출한다.

add esp, 8: 인자 2개 스택 정리

 

cmp 문에 정답이 있다.

cmp [ebp-4], 7E97E56C: 는 우리가 입력한 변수에 들어있는 값과 7F97E56C(10진수 2140661100)를 비교한다.

다르면 wrong으로 분기하고 같다면 밑에 Correct를 출력할 것이다.