EASY CRACK ME
Breakpointing the comparison in x32dbg and reading the expected password out one character at a time.
** 취미로 푸는 워게임 풀이기 때문에, 전문성이나 깊이있는 이해도가 떨어 질수있음. 개인기록용으로 올리는거기 때문 에, 전문성을 원하는거면 다른 보안 블로그의 풀이를 찾아보기 바람.

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

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가 연속으로 등장하거나, 입력 버퍼 주소를 기준으로 한 바이트씩 비교하는 코드가 나타나면 “문자 단위 검 증”일 가능성이 높다.

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

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

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