one_gadget을 설치할 때 항상 이런 이슈가 생긴다.
ERROR: Error installing one_gadget:
The last version of elftools (< 1.4.0, >= 1.0.2) to support your Ruby & RubyGems was 1.1.3. Try installing it with gem install elftools -v 1.1.3 and then running the current command again
elftools requires Ruby version >= 3.1. The current ruby version is 2.5.0.
Successfully installed bindata-2.5.0
The command '/bin/sh -c gem install one_gadget' returned a non-zero code: 1
ERROR: Service 'pwn-env' failed to build : Build failed
위 문제는 Ubuntu 18.04 기본 저장소에 설치되는 ruby가 2.5이고, 최신 one_gadget은 3.1 이상을요구한다.
따라서 Ruby를 2.7로 업그레이드하고, one_gadget또한 다운그레이드 해서 설치해줘야한다.
Dockerfile
FROM ubuntu:18.04
# 환경 변수 설정
ENV PATH="${PATH}:/usr/local/lib/python3.6/dist-packages/bin"
ENV LC_CTYPE=C.UTF-8
# 필수 패키지 설치
RUN dpkg --add-architecture i386
RUN apt update && apt install -y \
gcc \
g++ \
g++-multilib \
git \
python3 \
python3-pip \
sudo \
tmux \
vim \
wget \
net-tools \
iputils-ping \
libffi-dev \
libssl-dev \
python3-dev \
build-essential \
strace \
ltrace \
nasm \
gdb \
gdb-multiarch \
netcat \
socat \
patchelf \
file \
python3-distutils \
bison \
rpm2cpio \
cpio \
zstd \
zsh \
curl \
lib32stdc++6 \
libc6:i386 \
libc6-dbg:i386 \
software-properties-common \
qemu-user-static
# 18.04에서 one_Gadget을 사용하기 위해 ruby를 설치하기 위해선 Brightbox PPA 추가 후 Ruby 2.7 버전을 설치해야 한다.
# Ruby가 18.04 기본 패키지에선 3.1을 지원하지 않음 ㅠㅠ
RUN apt-add-repository -y ppa:brightbox/ruby-ng && apt update
RUN apt install -y ruby2.7 ruby2.7-dev
# 기본 Ruby를 2.7로 설정
RUN update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby2.7 100
# install pwndbg
WORKDIR /root
RUN git clone https://github.com/pwndbg/pwndbg
WORKDIR /root/pwndbg
RUN git checkout 2023.03.19
RUN ./setup.sh
# install pwntools
RUN pip3 install --upgrade pip
RUN pip3 install pwntools ropgadget python3-capstone seccomp-tools z3-solver
# RubyGems를 Ruby 2.7과 호환되는 마지막 버전(3.3.26)으로 업데이트
RUN gem install rubygems-update -v 3.3.26 && update_rubygems
# one_gadget 1.9.0 설치 (Ruby 2.7과 호환되는 마지막 버전)
RUN gem install one_gadget -v 1.9.0
WORKDIR /root
docker-compose.yml
version: '3'
services:
pwn-env:
build:
context: .
dockerfile: Dockerfile
working_dir: /root
container_name: pwn-probs
privileged: true
volumes:
- ./:/root
tty: true