2026 SPACE WAR - 02.TAURUS CTF 문제 풀이

0. 개요

문제 이름 : flat
문제 유형 : Pwnable

이 문제는 WASM 환경에서 실행되는 프로그램이지만,
취약점은 Wasmtime이나 WASM 자체가 아니라 그 위에서 동작하는 VM 형태의 로직에 존재한다.
문제 설명 그대로 핵심은 이 한 줄이다.

Memory-safe VM, unsafe program

목표는 입력을 조작하여 내부 로직을 원하는 방향으로 실행시키고
최종적으로 files/flag.txt를 읽는 것이다.


1. 실행 환경 분석

배포 환경:
socat TCP-LISTEN:13337 EXEC:wasmtime –dir=. chall.wasm

WASI 환경에서 실행
–dir=. 옵션으로 현재 디렉토리 접근 가능

즉, wasm 코드가 파일을 열 수 있다면 files/flag.txt도 읽을 수 있다.


2. 초기 분석

strings 결과에서 중요한 문자열들이 보인다.

  • files/public.txt
  • files/
  • public
  • nothing to see here.

데이터 섹션:

  • 65552: files/public.txt
  • 65569: public
  • 65582: files/

이미 파일 경로 관련 문자열이 포함되어 있다.


3. 핵심 구조 분석

3-1. 메인 루프 동작

메인 루프 흐름:

  1. 입력을 읽는다.
  2. 입력을 구조체에 복사한다.
  3. 구조체 내부 값으로 call_indirect 실행

핵심 코드:

1
2
3
4
5
6
7
memory.copy

i32.load
local.tee 4

i32.xor 55
call_indirect

3-2. 입력 구조

입력은 내부 구조체에 다음 위치로 복사된다.

base + 12 → 입력 시작

그리고 중요한 위치:

  • offset 24 → handler 1
  • offset 28 → handler 2
  • offset 32 → handler 3

이 3개 값이 실행 흐름을 결정


3-3. XOR 처리

actual_index = input ^ 55
입력값에 55를 XOR해야 실제 호출 인덱스가 된다.


4. 함수 테이블 분석

WASM indirect call 테이블:
[13, 14, 15, …, 52, 86, 88, 91, 92, 105]

즉:
index 1 → func 13
index 2 → func 14

index 40 → func 52

원하는 함수는 func 52


5. 파일 출력 루틴 분석

5-1. func 31

files/public.txt 출력
정상 동작 확인용


5-2. func 52

핵심 함수:
입력을 이용해 경로를 조립

  • offset 52
  • offset 60
  • offset 76

문자열을 이어 붙여 파일 경로 생성


6. 문제 핵심

6-1. 실행 조건

func 52는 바로 실행되지 않는다.

다음 전역 상태 필요:
global[66212]
global[66216]

특정 handler들이 이 값을 설정함


6-2. 필요한 핸들러 조합

실험 결과:
func 31 → (25, 33, 19)
func 52 → (25, 33, 40)

의미:

  • 25 → 상태 설정
  • 33 → 상태 설정
  • 40 → 파일 출력 (func 52)

7. 경로 조립 방식

처음 시도:
files/public.txt

실패

이유:
문자열이 이어붙여지는 구조

결과:
files/public.txtblic.txt

해결 방법

문자열을 분리:

  • offset 52 → “files/\x00”
  • offset 60 → “flag.txt\x00”

정상적으로 경로 생성


8. 공격 시나리오

8-1. 목표

func 52 실행 + 올바른 경로 전달


8-2. 입력 구성

핸들러:
25, 33, 40

입력값:
idx ^ 55


8-3. payload 구조

1
2
3
4
5
6
payload[24:28] = 25 ^ 55
payload[28:32] = 33 ^ 55
payload[32:36] = 40 ^ 55

payload[52:] = "files/"
payload[60:] = "flag.txt"

9. 익스플로잇 흐름

전체 흐름:

  1. 입력 → 구조체에 복사
  2. handler 3개 실행
  3. 상태 값 설정
  4. func 52 호출
  5. 경로 조립
  6. files/flag.txt 열기
  7. 내용 출력

10. 전체 공격 흐름 정리

  1. 입력 구조 분석
  2. call_indirect 구조 파악
  3. handler 위치 확인
  4. XOR 연산 고려
  5. 상태 세터 함수 탐색
  6. 파일 출력 함수 확인
  7. 문자열 조립 방식 이해
  8. payload 구성
  9. flag 출력

11. 포인트

이 문제의 포인트는 다음과 같다.

  • WASM 자체는 안전함
  • 입력이 VM 명령처럼 해석됨
  • handler index를 직접 제어 가능
  • 상태 설정 + 실행 체인 구성 가능
  • 문자열이 이어붙여지는 구조

VM 로직 자체가 취약


12. 정리

사용자 입력이 VM 명령 구조체로 그대로 사용되는 점을 이용해 handler 체인을 구성하고, 파일 출력 루틴을 실행하여 flag를 획득하는 문제


13. 최종 플래그

1
hspace{w4sm_t4bl3_ch41n_g0_brrr}