Pwn
CTF 문제풀이에서 Dockerfile 활용법
2025. 3. 13. 16:10

ctf나 wargame 문제를 풀 때보면, 문제파일에 도커파일이 포함되곤한다.

뭐하는 파일인지 알아보자.

도커 파일이란?

동일한 환경을 가진 도커 컨테이너를 실행하기위해 필요한 도커 이미지를 만들기 위한 텍스트 파일이다.

도커엔진에게 컨테이너가 어떻게 구성되어야 하는지 참고하는 파일으로 베이스 이미지의 선택, 필요한 패키지 설치, 환경변수 설정 등의 작업이 가능하다.

 

 

제공된 도커 파일을 이용하면 문제 서버와 동일하게 동작하는 컨테이너를 재현해볼 수 있다.

또한, 동일한 환경에서 바이너리를 실행시키며 디버깅을 진행할 수 있다.
libc 파일이 필요한 문제이지만 파일이 따로 제공되지 않았다면, 도커 파일을 빌드하고 컨테이너를 띄워서 문제 서버와 동일한 버전의 libc 파일을 꺼내올 수 있다.

 

위 예시 디렉토리에서는 libc-2.27.so 파일이 주어지므로 이를 통해 버전을 알아낼 수 있어 libc버전을 알기위해 도커를 굳이 쓸 필요가없다.

wsl Ubuntu 도커 설치

0. Docker Desktop

https://www.docker.com/

 

Docker: Accelerated Container Application Development

Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

windows wsl2 환경인 경우, 해당 사이트에서 그냥 Docker Desktop을 설치하면된다.

1. apt 패키지 업데이트

sudo apt update -y
sudo apt upgrade -y

2. 필수 패키지 설치

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

3. Docker GPG 키 & Docker 공식 apt 저장소 추가

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4. Docker 패키지 목록 업데이트 및 설치

sudo apt update -y
sudo apt install -y docker-ce docker-ce-cli containerd.io

5. Docker 버전 확인

docker --version

도커 빌드 및 컨테이너 실행

# 1. Docker Image 빌드 (Dockerfile 존재 위치로 이동하여 진행)
sudo docker build -t my_docker_image . 
# -t로 이미지 이름 지정

# 1-1. 생성한 Docker Image 확인
sudo docker images
# sudo docker rmi <IMAGE_ID> 로 삭제 가능

# 2. 생성한 이미지 바탕으로 Docker container 생성/실행
sudo docker run -d -p 7182:7182 --name my_docker_container my_docker_image
# -d : bg에서 실행, -p : host의 7182 포트를 컨테이너의 7182 포트에 매핑
# --name : 컨테이너 이름 지정, rm : 컨테이너 종료시 컨테이너 자동 제거

# 2-1.Docker 컨테이너의 현재 상태 확인
sudo docker ps
sudo docker ps -a	# 모든 컨테이너 상태 확인

# 도커 컨테이너 내부 접속
sudo docker exec -it my_docker_container /bin/bash
sudo docker exec -u root -it my_docker_container /bin/bash

# 도커 컨테이너 외부에서 libc 버전 알아내는 방법
docker exec -it 914afa5abf4e ldd --version

# 컨테이너 삭제 
docker rm 914afa5abf4e

libc 버전 확인하는 방법

도커에 필수 프로그램 설치 (vim, python, pwntools, pwndbg)

# root 권한에서 진행할 것
apt update -y
apt-get update -y
apt install -y vim
apt install python -y
apt-get install python2.7-dev python3-pip -y
pip install pwntools -y
apt-get install libcapstone-dev -y
sudo apt install -y git
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh

참고

https://hackerpark.tistory.com/entry/Docker-Windows-WSL%EC%97%90%EC%84%9C-Docker-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-Docker-Desktop-%EC%95%84%EB%8B%98

 

[Docker] WSL에서 Docker 설치하기 (Docker Desktop 아님)

들어가기에 앞서 현재 Windows 환경에 WSL이 설치되어있지 않다면 아래 포스팅을 참고하기 바랍니다.WSL 간단 설치 방법 [Windows] 단일 명령 한줄로 WSL2 + Ubuntu 통합 설치하기WSL(Windows Subsystem for Linux)

hackerpark.tistory.com

https://minseosavestheworld.tistory.com/119

 

Dockerfile을 이용해 CTF 문제 환경 구성하기

참고한 사이트 https://yenua.tistory.com/100 https://www.n1net4il.kr/posts/how-to-run-docker-for-ctf https://juntheworld.tistory.com/94 우리는 단일 dockerfile과 단일 container만 있으면 된다. 따라서 Image를 빌드할 때 docker-compos

minseosavestheworld.tistory.com

 

 

let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });