[Rev] 리버싱 · 작성: 2026-07-19 19:34:18 · 조회 4
크랙미(Crackme)는 리버싱 연습을 위해 일부러 만들어진 프로그램이다. 보통 "정답을 입력하면 성공 메시지를 보여준다"는 단순한 목표를 갖고 있고, 실제 소프트웨어의 라이선스 체크 로직을 축약해놓은 형태가 많다. 앞선 글들에서 다룬 정적/동적 분석 기법을 실전처럼 연습하기 가장 좋은 대상이다.
무슨 입력을 받는지, 성공/실패 시 어떤 메시지가 나오는지 먼저 눈으로 확인한다.
strings ./crackme | grep -iE "correct|wrong|success|fail|password"
실패/성공 메시지 문자열을 찾으면, 그 문자열이 어디서 참조되는지가 다음 단계의 목표 지점이 된다.
Ghidra/IDA에서 해당 문자열을 더블클릭하면 "이 문자열을 참조하는 코드 위치(cross-reference)"로 바로 이동할 수 있다. 그 근처의 cmp/조건분기가 정답 체크 로직일 가능성이 높다.
비교 방식은 대체로 세 가지 패턴 중 하나다.
strcmp로 바로 비교. ltrace로 strcmp 호출 인자를 보면 정답이 그대로 노출되는 경우가 많다.정답이라고 생각하는 값을 실제로 입력해서 성공 메시지가 뜨는지 확인한다. 안 되면 3~4단계를 다시 반복한다.
jne를 je로, 또는 nop으로) 무조건 성공하게 만든다. 가장 빠르지만 "어떻게 정답을 계산하는지"는 이해 못 해도 된다.입문 단계에서는 패치부터 익숙해지고, 익숙해지면 같은 문제를 Keygen 방식으로 다시 풀어보는 걸 권한다 — 같은 문제를 다른 목표로 다시 보면 놓쳤던 부분이 보인다.
같은 지점에서 오래 막힌다면, 정적 분석과 동적 분석 중 한쪽에만 의존하고 있지 않은지 점검해본다. 디컴파일된 의사코드만 계속 보고 있었다면 실제 값을 디버거로 찍어보고, 반대로 디버거로 브레이크포인트만 걸고 있었다면 전체 구조를 디컴파일러로 한 번 넓게 훑어보는 식으로 방식을 바꿔보는 게 도움이 된다.