
자동화된 ROP 체인 빌더로, 시맨틱 쿼리를 사용하여 바이너리에서 가젯을 추출하고 분석하며, X86/X64 아키텍처를 지원하고 Python API 및 CLI를 제공합니다.

ROPium (구 ROPGenerator)은 ROP 익스플로잇을 쉽게 만들어주는 라이브러리/도구입니다. 바이너리에서 가젯을 자동으로 추출 및 분석하고, 의미론적 쿼리로 ROP 체인을 찾을 수 있습니다. ROPium은 X86 및 X64 아키텍처를 지원하며, 곧 ARM도 지원할 예정입니다.
주요 기능:
rax=rbx+8, [rdi+0x20]=rax, rsi=[rbx+16], 0x08040212(1, 2, rax), [0xdeadbeaf] = "/bin/sh\x00", sys_execve(0xdeadbeef, 0, 0), sys_0x1(0), ...먼저 Capstone 디스어셈블리 프레임워크를 설치하세요:
sudo apt-get install libcapstone-dev
또한 최신 ROPgadget 릴리스가 필요합니다:
git clone https://github.com/JonathanSalwan/ROPgadget && cd ROPgadget
python setup.py install --user
CLI 도구를 사용하려면 prompt_toolkit을 설치하세요:
pip3 install prompt_toolkit
마지막으로 ROPium을 설치하세요:
git clone https://github.com/Boyan-MILANOV/ropium && cd ropium
make
make test
sudo make install
명령줄 인터페이스 래퍼 덕분에 ROPium을 대화형으로 사용하여 ROP 체인을 빠르게 구축할 수 있습니다:
ROP 체인을 스크립트에 직접 통합해야 하나요? 좋은 소식입니다, ROPium에는 파이썬 API가 있습니다!
바이너리를 로드하고 ROP 체인 찾기:
from ropium import *
rop = ROPium(ARCH.X64)
rop.load('/lib/x86_64-linux-gnu/libc-2.27.so')
chain = rop.compile('rbx = [rax + 0x20]')
ROP 체인을 다양한 형식으로 덤프하기:
>>> print( chain.dump() )
0x000000000009a851 (sub rax, 0x10; ret)
0x0000000000130018 (mov rax, qword ptr [rax + 0x30]; ret)
0x0000000000052240 (push rax; pop rbx; ret)
>>> print(chain.dump('python'))
from struct import pack
off = 0x0
p = ''
p += pack('<Q', 0x000000000009a851+off) # sub rax, 0x10; ret
p += pack('<Q', 0x0000000000130018+off) # mov rax, qword ptr [rax + 0x30]; ret
p += pack('<Q', 0x0000000000052240+off) # push rax; pop rbx; ret
>>> print(chain.dump('raw'))
b'Q\xa8\t\x00\x00\x00\x00\x00\x18\x00\x13\x00\x00\x00\x00\x00@"\x05\x00\x00\x00\x00\x00'
ROP 체인에 제약 조건 설정하기:
# ROP 체인에 나타나면 안 되는 바이트
rop.bad_bytes = [0x00, 0x0a, 0x0b]
# ROP 체인에 의해 변경되면 안 되는 레지스터
rop.keep_regs = ['rsi', 'rdx']
# ROP 체인이 유효하지 않은 주소를 가리킬 수 있는 레지스터를 역참조하는 것을 활성화/금지
# 안전 모드는 기본적으로 'True'입니다
rop.safe_mem = False
# 함수 호출 시 사용할 ABI 지정
rop.abi = ABI.X86_CDECL
# 시스템 콜 시 대상 시스템 지정
rop.os = OS.LINUX
필요하다면 Docker 컨테이너에서 ROPium을 실행할 수 있습니다. 컨테이너는 Dockerfile로부터 다음과 같이 생성할 수 있습니다:
# Docker 이미지를 생성합니다 (시간이 걸릴 수 있습니다!)
docker build . --tag ropium
# 대화형 모드로 이미지를 실행하고, 분석할 파일을 바인드 마운트합니다
docker run --rm -it -v /FULL/HOST/PATH/FILE:/tmp/FILE:ro ropium
(ropium)> load -a X86 /tmp/FILE
실제 이미지는 Debian Stretch 기반에 Python 3.7.3이 설치된 약 200MB입니다.
Boyan MILANOV - boyan.milanov (at) hotmail (dot) fr
ROPium은 MIT 라이선스로 제공됩니다.
기여자:
ROPium은 다음 훌륭한 프로젝트들을 사용합니다: