TIL: Docker for pwnable 🐋

Docker로 pwnable 문제 풀이 환경 세팅하기

https://sangjun.xyz/56

https://sechack.tistory.com/57

https://dreamhack.io/forum/qna/2619

Docker를 선택한 이유

  • 기존 WSL2는 Ubuntu 16.04를 지원하지 않음
  • 많은 pwnable 문제에서 Dockerfile를 제공함
  • image를 미리 만들어 두면 각각 독립된 환경을 가진 container를 빠르게 실행할 수 있음
  • vmware보다 빠름

Docker를 이용한 pwnable 문제 풀이 환경

dreamhack에 올린 질문글로부터 조언 받은 대로 Ubuntu version 별로 image를 만들고, container를 생성해서 문제를 풀기로 했다. 문제에서 주어지는 docker file을 읽고 이에 알맞은 Ubuntu version을 사용하고, libc 버전 같은 경우는 docker file를 읽어 알아내기로 했다. 이렇게 해도 안풀릴 경우에는 문제에서 주어지는 dockerfile로 container를 생성해서 libc 파일만 빼내기로 했다.

Dockerfile로부터 image 빌드하기

  1. 링크를 따라 docker desktop을 설치한다.
  2. Dockerfile는 여기에 있는 파일들을 사용했다. 16.04, 18.04, 20.04 버전의 Dockerfile를 각각 다른 폴더에 생성한다.
  3. cmd에서 각 폴더로 이동해 docker build -t [imagename]:[tag] .를 입력한다. image name은 모두 pwn으로 통일했고, tag는 각각 Ubuntu의 버전으로 적었다.
  4. 각 이미지 별로 빌드하는 데에 약 16분 정도의 시간이 소요되었다.

image로부터 container 생성 및 실행하기

아래와 같이 docker desktop에서 container를 run하니 여러가지 문제가 발생했다:

  • gdb로 debugging을 할 때 warning: Error disabling address space randomization: Operation not permitted라는 에러 문구가 떴다.
  • container로 문제 파일들을 넣어줄 때 docker cp 구문을 사용해야 했는데, 불편함이 컸다.

문제를 해결하기 위해 run을 할 때 아래와 같이 option을 넣어줬다.

docker run --name [container name] -v [host path]:[mounting point path in container] --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -ti [image id]

  • --name [container name]: container의 이름을 지정
  • -v [host path]:[mounting point path in container]: host path와 mounting point path in container가 같은 폴더를 공유하도록 한다. → 문제 파일들을 container로 옮기기 매우 편함!!
  • --cap-add=SYS_PTRACE --security-opt seccomp=unconfined: 여기에서 위에서 언급한 gdb 관련 문제를 해결하기 위해 사용하라고 알려준 option이다.
  • -ti: 이 option을 넣지 않으면 container가 실행되자마자 exit하기 때문에 zsh를 실행하기 위해 이 구문을 넣어야 함.

이후 이 생성한 container를 종료한 뒤 다시 실행하려면 아래와 같이 command를 입력하면 된다.

docker exec -it [container id] zsh

container에서 gdb를 process에 attach하는 법 - tmux

아래와 같이 python 프로그램을 작성해 gdb를 process에 attach하려 한다고 하자.

from pwn import *

p = process("./asdf")
gdb.attach(p)
#...

그냥 위 프로그램을 실행하면 ‘terminal is not set’이라는 error가 뜨면서 gdb가 실행되지 않는다. 이를 해결하기 위해 tmux를 설치한다.

https://hbase.tistory.com/200

tmux를 설치한 뒤 tmux 커맨드를 입력한 뒤 gdb를 실행하면 잘 실행됨.

tmux에서는 기본적으로 마우스를 사용할 수 없는데, Ctrl + b + [를 누르면 사용할 수 있다고 하지만 내 컴퓨터에서는 되지 않았다… Ctrl + b를 누르고 :set -g mouse on을 입력하니 마우스를 사용할 수 있었다.

Categories: ,

Updated:

Leave a comment