
Constructeur automatisé de chaînes ROP qui extrait et analyse les gadgets à partir de binaires en utilisant des requêtes sémantiques, prenant en charge les architectures X86/X64 avec une API Python et une CLI.

ROPium (ex-ROPGenerator) est une bibliothèque/outil qui facilite les exploits ROP. Il extrait et analyse automatiquement les gadgets des binaires et vous permet de trouver des chaînes ROP avec des requêtes sémantiques. ROPium prend en charge les architectures X86 et X64, bientôt étendue à ARM.
Fonctionnalités clés :
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), ...Installez d'abord le framework de désassemblage Capstone :
sudo apt-get install libcapstone-dev
Vous avez également besoin de la dernière version de ROPgadget :
git clone https://github.com/JonathanSalwan/ROPgadget && cd ROPgadget
python setup.py install --user
Pour utiliser l'outil CLI, installez prompt_toolkit :
pip3 install prompt_toolkit
Enfin, installez ROPium :
git clone https://github.com/Boyan-MILANOV/ropium && cd ropium
make
make test
sudo make install
Grâce à une interface en ligne de commande, vous pouvez utiliser ROPium de manière interactive pour construire rapidement des chaînes ROP :
Avez-vous besoin d'intégrer des chaînes ROP directement dans vos scripts ? Bonne nouvelle, ROPium dispose d'une API Python !
Chargement d'un binaire et recherche de chaînes 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]')
Export d'une chaîne ROP dans différents formats :
>>> 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'
Définir des contraintes sur les chaînes ROP :
# Bytes that should not appear in the ropchain
rop.bad_bytes = [0x00, 0x0a, 0x0b]
# Register that should not be clobbered by the ropchain
rop.keep_regs = ['rsi', 'rdx']
# Enable/Forbid ropchain to dereference registers that might hold invalid addresses
# Safe mode is 'True' by default
rop.safe_mem = False
# Specify which ABI you want to use when calling functions
rop.abi = ABI.X86_CDECL
# Specify which system to target when doing syscalls
rop.os = OS.LINUX
Si nécessaire, vous pouvez exécuter ROPium dans un conteneur Docker. Le conteneur peut être généré à partir du Dockerfile comme suit :
# Create your docker image (this will take time!)
docker build . --tag ropium
# Run the image in interactive mode, bind mounting the file to analyze
docker run --rm -it -v /FULL/HOST/PATH/FILE:/tmp/FILE:ro ropium
(ropium)> load -a X86 /tmp/FILE
L'image actuelle fait environ 200 Mo et est basée sur Debian Stretch avec Python 3.7.3 installé.
Boyan MILANOV - boyan.milanov (at) hotmail (dot) fr
ROPium est fourni sous licence MIT.
Contributeurs :
ROPium utilise les projets suivants :