RE_VAULT 소개: 역공학 프로젝트 공개 아카이브

발행: (2025년 12월 3일 오전 04:44 GMT+9)
10 min read
원문: Dev.to

Source: Dev.to

RE_VAULT란?

RE_VAULT는 내가 공개한 역공학 프로젝트와 챌린지 바이너리들의 아카이브입니다.
그 안의 핵심 프로젝트는 Flag Hunt 2 – Black Cipher Edition이라는 C 프로그램으로, 적대적인 포렌식 아티팩트처럼 동작합니다. 메뉴, 미끼 출력, 가짜 분석 모듈, 그리고 여러 함정이 포함되어 있으며, 동일한 바이너리 안에 여러 독립적인 챌린지를 숨겨두고 있습니다.

  • 주요 플래그 10개
  • 절대 출력되지 않는 숨겨진 보너스 플래그 1개
  • 다층적인 난독화와 오해 유도

목표는 이상한 악성코드나 사고 아티팩트와 비슷한 느낌을 주면서도 학습에 적합하도록 만든 것입니다.

대상 독자

다음 중 하나에 해당한다면 Black Cipher는 유용할 것입니다:

  • Ghidra 혹은 다른 RE 도구를 배우고 있으며 단순한 crackme보다 더 복잡한 것을 원한다.
  • 실제 악성코드에 손대지 않고도 악성코드에서 쓰이는 트릭을 이해하고 싶다.
  • C, 저수준 동작, 그리고 특이한 제어 흐름을 즐긴다.
  • 공격자와 분석가 양쪽의 사고 방식을 연습하고 싶다.

이 프로젝트는 세 가지 방식으로 접근할 수 있습니다:

  1. 순수 퍼즐 – 바이너리를 실행하고, 만지고, Ghidra와 노트북을 이용해 모든 플래그를 찾아낸다.
  2. 학습 랩 – 한 번에 하나의 모듈에 집중한다(예: VM만, 힙 아티팩트만).
  3. 레퍼런스 자료 – 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에서 각 챌린지를 찾는 방법.
  • 디컴파일된 코드에서 주목해야 할 부분.
  • 인코딩과 해시가 실제로 어떻게 동작하는지.
  • 첫 로드부터 최종 플래그까지의 구체적인 절차.

다음 중 해당되는 경우 솔루션 문서를 요청할 수 있다:

  • 수업에 활용하고 싶은 강사,
  • 막히고 작업을 확인하고 싶은 학생, 혹은
  • 코드를 검토하고 전체 논리를 보고 싶은 사람.

메일을 보내면 솔루션 문서를 받아볼 수 있다.

Back to Blog

관련 글

더 보기 »

계정 전환

@blink_c5eb0afe3975https://dev.to/blink_c5eb0afe3975 여러분도 알다시피 저는 다시 제 진행 상황을 기록하기 시작했으니, 이것을 다른…