BLOG
Tracefield · 02
Tracefield · 01
블로그 · 14
Vibe Audit · 04
Vibe Audit · 03
Vibe Audit · 02
Vibe Audit · 01
출판편집자 · 01
StudyTree · 01
SecurityOps · 02
SecurityOps · 01
AI챗봇 · 04
AI챗봇 · 03
AI챗봇 · 02
AI챗봇 · 01
퍼플심 · 04
퍼플심 · 03
퍼플심 · 02
퍼플심 · 01
블로그 · 13
rootscan · 07
rootscan · 06
블로그 · 12
블로그 · 11
블로그 · 10
블로그 · 09
블로그 · 08
블로그 · 07
블로그 · 06
블로그 · 05
블로그 · 04
블로그 · 03
블로그 · 02
블로그 · 01
rootscan · 05
rootscan · 04
rootscan · 03
asmspeak · 03
asmspeak · 02
rootscan · 02
asmspeak · 01
rootscan · 01
웹보안도구 · 02
웹보안도구 · 01
루트캠프 · 02
루트캠프 · 01
All notes 167
다단계 인증 로직의 분석과 파해 케이스 스터디
지금까지 본 GDB, Ghidra, 레지스터 조작, 알고리즘 분석을 한 번에 묶어보는 예제다. 실제 CrackMe 샘플 auth_final을 기준으로, 단계별로 어떻게 풀어가는지 정리한다.
1. 시나리오 및 보호 기법
대상 프로그램은 3단계 보호 로직을 가진다. 결국 올바른 ID와 Serial Key를 찾아 인증을 통과해야 한다.
- Stage 1: 안티 디버깅 (
ptrace탐지) - Stage 2: ID 검증 (문자열 비교)
- Stage 3: Serial Key 검증 (XOR 알고리즘)
2. 단계별 분석
Stage 1: 안티 디버깅 우회
GDB로 실행하면 Debugger Detected!와 함께 종료된다. ptrace 탐지가 붙어 있다고 보면 된다.
catch syscall ptrace로 잡은 뒤, 호출 직후 RAX를 0으로 바꿔주면 우회가 가능하다. 그러면 Enter ID:가 출력되고 다음 단계로 넘어간다.
Stage 2: ID 추출(정적 분석)
Ghidra에서 Enter ID: 문자열을 따라가면 strcmp 비교 루틴이 나온다. 입력값과 특정 문자열을 직접 비교하는 구조다.
if (strcmp(input_id, "admin") == 0) {
go_stage3();
}
비교 문자열이 평문으로 보이므로, 첫 번째 정답 ID는 admin이다.
Stage 3: Serial Key 역산(알고리즘 분석)
ID를 넣으면 Enter Serial:을 요구한다. 검증 로직을 디컴파일하면 아래 형태가 나온다.
// 디컴파일 코드
for (int i = 0; i < 5; i++) {
if (input_serial[i] != (id[i] ^ 0x0F)) {
fail();
}
}
단순 문자열 비교가 아니라, ID 각 문자를 0x0F와 XOR한 결과와 비교한다. 그래서 같은 계산을 스크립트로 옮기면 정답을 바로 만들 수 있다.
id_str = "admin"
serial = ""
for char in id_str:
serial += chr(ord(char) ^ 0x0F)
print(serial)
# 결과: nkbfa
두 번째 정답 Serial은 nkbfa다.
3. 최종 결과
- ID:
admin - Serial:
nkbfa
위 값을 넣으면 Access Granted!가 출력된다. 이 예제는 동적 분석, 정적 분석, 그리고 스크립트 자동화가 어떻게 이어지는지 한 번에 보여준다.

