suminworld

system

Mac M4(ARM64)에서 x86_64 Pwnable 환경 세팅: Docker🐳

숨usm 2026. 1. 1. 23:49

공모전 하면서 docker로 팀원들과 삽질했는데 이번에 ctf때문에 Docker Desktop 설치하면서 환경 설정 정리해보았습니다.
3시간 삽질 후 결론
: Mac에서 pwnable -> Docker + context 고정

+ 아마 수정할 부분이 있을것 같은데 일단 기록용으로 올려둡니다!


TL;DR

Mac M4(ARM64)에서 x86_64 CTF 바이너리 돌리기:

# 1회 설정
docker context use desktop-linux

# 실행 시
cd ~/Desktop/ctf/문제폴더
docker run --rm -it --platform linux/amd64 \
  -v "$PWD":/work -w /work \
  pwn-ubuntu:24.04 bash

 

  1. --platform linux/amd64
  2. -v "$PWD":/work
  3. docker context use desktop-linux

전체 구조

┌─────────────────────────────────────────────────────────────┐
│  🖥️  HOST (Mac M4 - ARM64)                                  │
│  프롬프트: user@MacBookAir ~/Desktop/ctf/deploy             │
│  아키텍처: arm64 (Apple Silicon)                             │
│  사용: docker, cd, ls, VS Code                              │
│                                                               │
│  ┌─────────────────────────────────────────────────────┐    │
│  │  📂 ~/Desktop/ctf/deploy/                           │    │
│  │     ├── prob          (x86_64 ELF)                  │    │
│  │     ├── prog.bin                                    │    │
│  │     ├── Dockerfile.pwn                              │    │
│  │     └── exploit.py                                  │    │
│  └─────────────────────────────────────────────────────┘    │
│                          │                                   │
│                          │  -v "$PWD":/work                  │
│                          ↓                                   │
│  ┌──────────────────────────────────────────────────────┐   │
│  │  🐳 CONTAINER (Ubuntu 24.04 - x86_64)               │   │
│  │  프롬프트: root@xxxxx:/work#                        │   │
│  │  아키텍처: x86_64 (amd64)                            │   │
│  │  사용: gdb, checksec, pwntools, pwndbg              │   │
│  │                                                       │   │
│  │  ┌────────────────────────────────────────────┐     │   │
│  │  │  📂 /work/  (호스트 deploy 폴더와 동일!)  │     │   │
│  │  │     ├── prob         ← 실시간 동기화!     │     │   │
│  │  │     ├── prog.bin                           │     │   │
│  │  │     └── exploit.py                         │     │   │
│  │  └────────────────────────────────────────────┘     │   │
│  └──────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

왜 Mac에서 바로 안 되나?

ARM64 vs x86_64

# Mac에서 직접 실행
$ ./prob
zsh: exec format error: ./prob

# 파일 확인
$ file prob
prob: ELF 64-bit LSB pie executable, x86-64, ...

CTF 바이너리는 대부분 x86_64 Linux ELF인데, Mac M4는 ARM64라서 직접 실행 불가.

🐳 해결: Docker로 x86_64 환경 에뮬레이션

Docker가 QEMU를 이용해 x86_64를 에뮬레이션 해줌.


환경 세팅 (1회만)

Step 1: Docker 이미지 빌드

Dockerfile.pwn

FROM ubuntu:24.04

# 기본 도구 + checksec
RUN apt update && apt install -y \
    build-essential \
    gdb \
    git \
    python3 \
    python3-pip \
    vim \
    wget \
    file \
    checksec

# pwndbg 설치
RUN git clone https://github.com/pwndbg/pwndbg /root/pwndbg && \
    cd /root/pwndbg && \
    ./setup.sh

# pwntools 설치
RUN pip3 install pwntools --break-system-packages

# GDB 자동 로드
RUN echo "source /root/pwndbg/gdbinit.py" >> /root/.gdbinit

WORKDIR /work

 
 
build:

cd ~/Desktop/ctf
docker build -t pwn-ubuntu:24.04 -f Dockerfile.pwn .

Step 2: Context 고정

# 현재 context 확인
docker context ls

# Docker Desktop으로 고정
docker context use desktop-linux

⚙️ docker context

Docker 엔진을 2개 이상 쓰면(예: Docker Desktop + OrbStack) 이미지 저장소가 분리됨.
자주 보는 에러:

Unable to find image ... locally
pull access denied ... repository does not exist

 
로그인 문제가 아니라 context가 다른 엔진을 보고 있어서 발생.

컨텍스트 확인/전환

docker context ls
docker context show
docker context use desktop-linux

매번 쓰는 워크플로우

기본 사용법

# 1. 문제 폴더로 이동
cd ~/Desktop/ctf/gmdsoft/deploy

# 2. 컨테이너 실행
docker run --rm -it --platform linux/amd64 \
  -v "$PWD":/work -w /work \
  pwn-ubuntu:24.04 bash

# 3. 컨테이너 안에서
root@xxx:/work# ls
prob  prog.bin

root@xxx:/work# file prob
prob: ELF 64-bit LSB pie executable, x86-64, ...

root@xxx:/work# checksec --file=./prob
[*] '/work/prob'
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled

root@xxx:/work# gdb ./prob

 
옵션 의미

--rm종료 시 컨테이너 자동 삭제
-it인터랙티브 터미널
--platform linux/amd64x86_64 강제 (필수!)
-v "$PWD":/work현재 폴더를 /work로 마운트
-w /work시작 위치를 /work로 설정

저는 편의를 위해 아래 내용을 .zshrc에 추가하였습니다.

pwn() {
  docker context use desktop-linux >/dev/null 2>&1
  docker run --rm -it --platform linux/amd64 \
    -v "$PWD":/work -w /work \
    pwn-ubuntu:24.04 bash
}

 
사용

cd ~/Desktop/ctf/문제폴더
pwn

트러블슈팅

1. "Unable to find image" 에러

증상

$ docker run pwn-ubuntu:24.04
Unable to find image 'pwn-ubuntu:24.04' locally

 
원인: Docker context가 OrbStack/다른 엔진으로 되어있음
 
해결

docker context use desktop-linux
docker images  # 이미지 확인

2. 컨테이너 안에서 파일이 안 보이는 경우

증상

root@xxx:/work# ls
# 아무것도 없음

 
원인: -v 마운트를 안 했거나 잘못된 경로
 
해결

# 호스트에서 pwd 확인
pwd  # ~/Desktop/ctf/deploy

# 이 경로로 마운트
-v "$PWD":/work

3. GDB ptrace 경고

증상

pwndbg> r
warning: linux_ptrace_test_ret_to_nx: Cannot PTRACE_GETREGS
Couldn't get CS register: Input/output error

설명: macOS Docker Desktop은 보안/가상화 구조상 ptrace 기반 기능이 일부 제한될 수 있음
 
영향:

  • 일부 GDB 기능 제한됨
  • breakpoint는 작동하지만 레지스터/heap 시각화 일부 제한

대안:

  • 정적 분석(Ghidra) + 실행 테스트 + exploit 검증
  • Linux VM(UTM, Multipass) 사용
  • 원격 Linux 서버

4. "exec format error"

증상

$ ./prob
zsh: exec format error: ./prob

원인: --platform linux/amd64 빠뜨림
 
해결

docker run --platform linux/amd64 ...

파일 동기화 매핑

HOST (Mac)                         CONTAINER (Linux)
──────────────────────────────────────────────────────
~/Desktop/ctf/deploy/prob      <-> /work/prob
~/Desktop/ctf/deploy/exploit.py <-> /work/exploit.py

✅ VS Code에서 exploit.py 수정 → 컨테이너에서 즉시 반영
✅ 컨테이너에서 출력 생성 → 호스트에서 즉시 확인

🐳 Docker 이미지/컨텍스트 구조

┌──────────────────────────────────────────────────┐
│  Docker Desktop (desktop-linux)                  │
│                                                   │
│  📦 pwn-ubuntu:24.04                             │
│     - Ubuntu 24.04 x86_64                        │
│     - pwndbg ✅                                   │
│     - pwntools ✅                                 │
│     - checksec ✅                                 │
│     - gdb, python3, git ✅                        │
└──────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────┐
│  OrbStack (orbstack) - 별도 엔진                 │
│  ⚠️ 이미지 저장소가 완전히 다름!                 │
└──────────────────────────────────────────────────┘

체크리스트

호스트(Mac)에서 정상

uname -m                # arm64
docker context show     # desktop-linux
pwd                     # ~/Desktop/ctf/deploy

컨테이너 안에서 정상

uname -m    # x86_64
pwd         # /work
ls          # prob 보여야 함

실전 예시

# 1. 파일 준비
cd ~/Desktop/ctf/gmdsoft/deploy
ls
# prob  prog.bin  Dockerfile

# 2. 컨테이너 시작
pwn

# 3. 분석 시작
root@abc:/work# checksec --file=./prob
[*] '/work/prob'
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled

root@abc:/work# ./prob
1) add note
2) link note
3) edit note
4) show note
5) delete note
6) exit
>

# 4. Exploit 작성 (호스트 VS Code)
# 컨테이너에서 바로 테스트
root@abc:/work# python3 exploit.py

Mac Docker의 한계와 대안

GDB 디버깅 제한

Docker로 충분한 경우:

  • ✅ 바이너리 분석
  • ✅ 실행 테스트
  • ✅ Exploit 작성/검증
  • ✅ 기본적인 breakpoint 디버깅

Docker로 부족한 경우:

  • ❌ 세밀한 레지스터/메모리 분석
  • ❌ heap 시각화 필수 작업
  • Linux VM(UTM x86_64, Multipass) 또는 원격 서버 추천

다음 CTF 시작 템플릿

# 새 CTF 시작
mkdir ~/Desktop/ctf/새문제
cd ~/Desktop/ctf/새문제

# 파일 다운로드 후
pwn

🎓 삽질 결론

Mac M4에서 x86_64 pwnable 환경:

docker context use desktop-linux
cd ~/Desktop/ctf/문제폴더
pwn

📚 참고 자료