EASY CRACK ME

Breakpointing the comparison in x32dbg and reading the expected password out one character at a time.

2026.08.18 Reversing original post

** 취미로 푸는 워게임 풀이기 때문에, 전문성이나 깊이있는 이해도가 떨어 질수있음. 개인기록용으로 올리는거기 때문 에, 전문성을 원하는거면 다른 보안 블로그의 풀이를 찾아보기 바람.

Figure 1

Reversing.kr에서 Easy Crackme 문제 파일을 다운로드한 뒤, x32dbg에서 실행 파일을 연다. 좌측 Symbols(또는 Modules/Functions) 창을 확인하면 main(또는 엔트리포인트 → main으로 이어지는 함수)과 여러 DLL 함수들이 보인 다. 이 문제의 목표는 패스워드(플래그) 확인 루틴 분석이므로, main(혹은 main으로 추정되는 함수)을 더블클릭하여 디 스어셈블리 뷰로 이동한다.

Figure 2

Strings(A2)를 열고 프로그램 실행 시 화면에 출력될 것 같은 문자열을 찾는다. 예를 들면:

  • 프로그램 제목/프롬프트로 보이는 문자열 (예: EasyUnpack me 등)
  • 실패 메시지 (예: incorrect / incorrect password)
  • 성공 메시지 (예: correct)

이 문자열들을 찾으면, 해당 문자열에서 **XREF(참조 위치)**로 이동한다. 보통 push offset “incorrect” 같은 형태로 참조되며, 그 지점 근처에 분기 조건(je/jne) 또는 cmp/test가 존재한다. 즉, “성공/실패 문자열 근처 = 검증 결과 분기 지점”인 경우가 많다. 따라서 다음에 브레이크포인트를 건다:

  • incorrect 출력 직전/직후 코드 라인
  • correct 출력 직전/직후 코드 라인
  • 그 주변에 있는 cmp/test/je/jne (검증 결과 판단)

검증 루틴이 call 401150 같은 형태로 함수로 분리되어 있다면, 해당 call에도 BP를 걸고 F7(Step Into)로 들어가 내부를 확인한다. 내부에서 cmp가 연속으로 등장하거나, 입력 버퍼 주소를 기준으로 한 바이트씩 비교하는 코드가 나타나면 “문자 단위 검 증”일 가능성이 높다.

Figure 3

아직 정답을 모르는 상태이므로 F9(Run)으로 실행 후 입력값을 임의로 넣는다. 예를 들어 123456789와 같이 길이가 있 는 값으로 넣어본다. 이후 BP가 걸린 cmp에 도달할 때마다 레지스터/메모리를 관찰한다 (유저의 인풋과 (한자리수) 와 답 을 비교하는걸 볼수있다) 그대로 프로그램을 진행해버리면, incorrect password 문구가 뜨기때문에, 밑에 그림처럼 비교 하는 유저의 인풋과 답이 (a and 2) 다를때면, 틀린 지점의 비교값을 정답으로 교체하는 방식으로 패스워드를 순차적으로 알아낼 수 있다. 123456789 대신 다시 프로그램을 리셋해 틀린 부분을 맞는 부분으로 채워주면 된다. (1a3456789)

Figure 4

BP에서 확인한 비교 결과를 바탕으로 입력을 수정해가면, 패스워드가 순차적으로 드러난다., 1a5y56789 까지 알게된다. 그 뒤 프로그램 화면/레지스터/메모리에서 힌트 문자열로 보이는 R3versing을 보고, 남은 부분을 추론하여, 답을 다시 1a5yR3versing 으로 바꿔본다. 그후 다음에 있는 cmp 구문들에서 정확하게 유저 인풋과 비교하는 값이 일치하는것을 볼 수있다.

Figure 5

(이런식으로). 그후 루프를 벋어난후, correct 문자열 바로뒤에있는 cmp 구문에서 1 과 E 를 한번더 비교하는것을 볼수있 다. 그렇기 때무네 유저 인풋인 1의 부분을 E 로 바꾼 값이 정답임을 알수있다.그후 exe 파일을 실행해서 Ea5yR3versing 를 실행하면, 답이 맞는것을 볼수있다.

그럼으로 Ea5yR3versing 라는 플래그 (패스워드) 를 얻은것이다.