RE_VAULT 소개: 역공학 프로젝트 공개 아카이브
Source: Dev.to
RE_VAULT란?
RE_VAULT는 내가 공개한 역공학 프로젝트와 챌린지 바이너리들의 아카이브입니다.
그 안의 핵심 프로젝트는 Flag Hunt 2 – Black Cipher Edition이라는 C 프로그램으로, 적대적인 포렌식 아티팩트처럼 동작합니다. 메뉴, 미끼 출력, 가짜 분석 모듈, 그리고 여러 함정이 포함되어 있으며, 동일한 바이너리 안에 여러 독립적인 챌린지를 숨겨두고 있습니다.
- 주요 플래그 10개
- 절대 출력되지 않는 숨겨진 보너스 플래그 1개
- 다층적인 난독화와 오해 유도
목표는 이상한 악성코드나 사고 아티팩트와 비슷한 느낌을 주면서도 학습에 적합하도록 만든 것입니다.
대상 독자
다음 중 하나에 해당한다면 Black Cipher는 유용할 것입니다:
- Ghidra 혹은 다른 RE 도구를 배우고 있으며 단순한 crackme보다 더 복잡한 것을 원한다.
- 실제 악성코드에 손대지 않고도 악성코드에서 쓰이는 트릭을 이해하고 싶다.
- C, 저수준 동작, 그리고 특이한 제어 흐름을 즐긴다.
- 공격자와 분석가 양쪽의 사고 방식을 연습하고 싶다.
이 프로젝트는 세 가지 방식으로 접근할 수 있습니다:
- 순수 퍼즐 – 바이너리를 실행하고, 만지고, Ghidra와 노트북을 이용해 모든 플래그를 찾아낸다.
- 학습 랩 – 한 번에 하나의 모듈에 집중한다(예: VM만, 힙 아티팩트만).
- 레퍼런스 자료 – C 소스를 읽으며 특정 회피 패턴이 어떻게 구현됐는지 이해한다.
Black Cipher의 동작 방식
바이너리를 실행하면 깔끔한 CTF‑스타일 인터페이스가 아니라 작은 분석 콘솔이 나타납니다:
- 포렌식 도구인 척하는 배너.
- “분석 모듈” 목록.
- 각 메뉴 옵션은 서로 다른 챌린지 경로를 트리거한다.
일부 모듈은 잡음을 출력하고, 일부는 실패하며, 몇 개만이 별다른 노력 없이 깨끗한 플래그를 제공합니다. 어떤 출력이 진짜이고, 어떤 것이 미끼이며, 어떤 것이 직접 디코딩할 수 있는 인코딩 형태인지를 파악하는 것이 챌린지의 핵심입니다.
스포일러 경고
이 글의 나머지 부분은 바이너리 내부 구조를 다룹니다. 정확한 플래그 문자열이나 전체 풀이를 제공하지 않으며, 설명은 의도적으로 높은 수준에 머무릅니다. 완전히 눈을 가리고 진행하고 싶다면 지금 읽기를 멈추고, 레포를 클론한 뒤 프로그램을 빌드하고 나중에 다시 오세요.
챌린지의 고수준 구조 (경미한 스포일러)
Black Cipher의 각 메뉴 항목은 서로 다른 스타일의 챌린지에 매핑되어 있으며, 하나의 실행 파일에 “미니 커리큘럼” 형태의 RE 기법을 압축합니다.
1. 문자열 복호화 모듈
- 메모리에 저장된 암호화된 문자열 테이블.
- 디코더 루틴은 XOR과 회전을 혼합한다.
- Ghidra에서 루틴을 따라가면 실제 텍스트를 복구할 수 있다; 원시 출력은 의도적으로 뒤섞여 있다.
2. 제어 흐름 추적기
- 포인터 테이블이 있는 함수‑포인터 미로.
- 일부는 죽음의 길이나 미끼로 이어지고, 한 경로만이 진짜 플래그로 연결된다.
- 이상한 제어 흐름을 재구성하고 실제 실행된 코드를 집중적으로 파악하는 연습.
3. 해시 검증 시스템
- 커스텀 다항식 스타일 해시 함수.
- 정답 문자열은 평문으로 저장되지 않는다.
- 해시를 재구현하고 올바른 입력을 찾아낸다.
4. 바이너리 데이터 추출기
- 바이너리 섹션에 숨겨진 데이터(무작위 바이트처럼 보임).
- 간단한 변환을 통해 바이트를 의미 있는 데이터로 변환한다.
- Ghidra로
.rodata레이아웃을 살펴보고 디코딩 스크립트를 작성한다.
5. 안티‑탬퍼 탐지기
ptrace와 타이밍 체크를 이용한 안티‑디버그 트릭.- 체크를 통과해야 플래그가 드러난다.
- 안티‑디버그 로직을 이해하고, 패치하거나 시뮬레이션한다.
6. 가상 머신 분석기
- 바이트코드 배열과 인터프리터 루프를 가진 작은 커스텀 VM.
- 올바른 상태로 VM을 실행하면 결국 플래그를 출력한다.
- VM을 역공학하고 에뮬레이트하거나 수동으로 단계별 실행한다.
7. 수학적 풀이기
- 논리 함정: 보이는 방정식은 실제 중요한 것이 아니다.
- 실제 제약은 다른 분기 뒤에 숨겨져 있다.
- 플래그로 이어지는 실제 조건들을 추적한다.
8. 메모리 포렌식 도구
- 챌린지는 힙에 존재한다: 부분적으로 인코딩된 데이터를 가진 구조체.
- 프로그램은 잡음 바이트만 출력하고, 깨끗한 플래그는 직접 나타나지 않는다.
- 구조체 레이아웃을 파악하고, 인코딩을 이해한 뒤 원본 내용을 복원한다.
9. 네트워크 프로토콜 디코더
- 바이너리에 삽입된 가짜 PCAP‑스타일 블롭.
- 간단한 프로토콜 검증이 파싱을 결정한다.
- 작은 디코더가 숨겨진 메시지를 복구한다.
- 악성코드에서 흔히 볼 수 있는 “임베디드 바이너리 블롭 + 디코드 루틴” 패턴을 연습한다.
10. 다단계 해시 검증기
- 커스텀 해시‑유사 함수들의 체인; 각각이 다음 함수에 입력으로 전달된다.
- 매우 특정한 문자열만이 모든 검증을 통과한다.
- 전체 체인을 스크립트로 재현해 플래그를 찾는다.
숨겨진 보너스 플래그
열 번째가 아닌 열한 번째 플래그는 절대 출력되지 않으며 명시적으로 언급되지 않는다. 힌트:
- 바이너리의 커스텀 섹션에 존재한다.
- 바이트가 암호화되고 뒤집혀 있다.
- 복호화 로직이 여러 무관한 함수에 흩어져 있다.
ELF 내부 구조, 커스텀 섹션, 그리고 Ghidra 스크립팅에 익숙하다면 결국 찾아낼 수 있다. 이 플래그는 속도보다 바이너리에 대한 완전한 이해를 보상한다.
솔루션을 얻는 방법
레포지토리에는 전체 솔루션이 의도적으로 포함되어 있지 않다. 별도 솔루션 문서(요청 시 제공)는 다음을 단계별로 안내한다:
- Ghidra에서 각 챌린지를 찾는 방법.
- 디컴파일된 코드에서 주목해야 할 부분.
- 인코딩과 해시가 실제로 어떻게 동작하는지.
- 첫 로드부터 최종 플래그까지의 구체적인 절차.
다음 중 해당되는 경우 솔루션 문서를 요청할 수 있다:
- 수업에 활용하고 싶은 강사,
- 막히고 작업을 확인하고 싶은 학생, 혹은
- 코드를 검토하고 전체 논리를 보고 싶은 사람.
메일을 보내면 솔루션 문서를 받아볼 수 있다.