공모전 하면서 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
- --platform linux/amd64
- -v "$PWD":/work
- 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/amd64 | x86_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
📚 참고 자료
'system' 카테고리의 다른 글
| 🛡️리눅스 백신 실습2 - ClamAV 실시간 보호 구현 (inotify + bash 자동화) (0) | 2025.11.26 |
|---|---|
| Rust for Linux: 커널 개발을 위한 3가지 핵심 언어 기능 (0) | 2025.10.29 |
| 사이드 채널 공격(Side Channel Attack): Flush+Reload로 캐시 접근 패턴 들여다보기 (0) | 2025.09.20 |
| [리눅스 프로그래밍 · DevOps] GitHub Actions로 C Signal Handling Demo CI/CD 구축기 (0) | 2025.09.18 |
| 🛡️SGI 서울보증 랜섬웨어 사건 정리 & 리눅스 백신 실습 (1) | 2025.09.16 |