
Un buscador de ROP Gadgets multihilo extremadamente rápido™. Alternativa a ropper/ropgadget (actualmente solo para x86)
ropr es un buscador de gadgets ROP ultrarrápido y multihilo
Los ROP (Return Oriented Programming) Gadgets son pequeños fragmentos de unas pocas instrucciones de ensamblador que típicamente terminan en una instrucción ret y que ya existen como código ejecutable dentro de cada binario o biblioteca. Estos gadgets pueden utilizarse para la explotación de binarios y para subvertir ejecutables vulnerables.
Cuando las direcciones de muchos ROP Gadgets se escriben en un búfer, formamos una ROP Chain. Si un atacante puede mover el puntero de pila hacia esta ROP Chain, entonces el control puede transferirse completamente al atacante.
La mayoría de los ejecutables contienen suficientes gadgets para escribir una ROP Chain Turing-completa. Para aquellos que no, siempre se pueden usar bibliotecas dinámicas contenidas en el mismo espacio de direcciones, como libc, una vez que conocemos sus direcciones.
La belleza de usar ROP Gadgets es que no es necesario escribir nuevo código ejecutable en ninguna parte: un atacante puede lograr su objetivo utilizando solo el código que ya existe en el programa.
Por lo general, el primer requisito para usar ROP Gadgets es tener un lugar donde escribir tu ROP Chain: puede ser cualquier búfer legible. Simplemente escribe las direcciones de cada gadget que quieras usar en ese búfer. Si el búfer es demasiado pequeño, puede que no haya suficiente espacio para escribir una ROP Chain larga, por lo que un atacante debe tener cuidado de diseñar su ROP Chain de manera que sea lo suficientemente eficiente para caber en el espacio disponible.
El siguiente requisito es poder controlar la pila. Esto puede ser en forma de un desbordamiento de pila, que permite escribir la ROP Chain directamente debajo del puntero de pila, o un "stack pivot", que suele ser un único gadget que mueve el puntero de pila al resto de la ROP Chain.
Una vez que el puntero de pila está al inicio de tu ROP Chain, la siguiente instrucción ret hará que los gadgets se ejecuten en secuencia, usando cada uno el siguiente como su dirección de retorno en su propio marco de pila.
También es posible agregar punteros a funciones en una ROP Chain, teniendo cuidado de que los argumentos de la función se suministren después del siguiente elemento de la ROP Chain. Esto suele combinarse con un "pop gadget", que extrae los argumentos de la pila para transicionar suavemente al siguiente gadget después de los argumentos de la función.
Instalación fácil:
cargo install ropr
the application will install to `~/.cargo/bin`
Desde el código fuente:
git clone https://github.com/Ben-Lichtman/ropr
cd ropr
cargo build --release
el binario resultante estará ubicado en target/release/ropr
Alternativamente:
git clone https://github.com/Ben-Lichtman/ropr
cd ropr
cargo install --path .
la aplicación se instalará en ~/.cargo/bin
USAGE:
ropr [OPTIONS] <BINARY>
ARGS:
<BINARY> The path of the file to inspect
OPTIONS:
-b, --base-pivot Filters for gadgets which alter the base pointer
-c, --colour <COLOUR> Forces output to be in colour or plain text (`true` or `false`)
-h, --help Print help information
-j, --nojop Removes "JOP Gadgets" - these may have a controllable branch,
call, etc. instead of a simple `ret` at the end
-m, --max-instr <MAX_INSTR> Maximum number of instructions in a gadget [default: 6]
-n, --noisy Includes potentially low-quality gadgets such as prefixes,
conditional branches, and near branches (will find significantly
more gadgets)
-p, --stack-pivot Filters for gadgets which alter the stack pointer
-r, --norop Removes normal "ROP Gadgets"
-R, --regex <REGEX> Perform a regex search on the returned gadgets for easy filtering
--range <RANGE> Search between address ranges (in hexadecial) eg. `0x1234-0x4567`
--raw <RAW> Treats the input file as a blob of code (`true` or `false`)
-s, --nosys Removes syscalls and other interrupts
-V, --version Print version information
Por ejemplo, si estuviera buscando una forma de llenar rax con un valor de otro registro, podría optar por filtrar con la expresión regular ^mov eax, ...;:
❯ ropr /usr/lib/libc.so.6 -R "^mov eax, ...;" > /dev/null
==> Found 197 gadgets in 0.118 seconds
Ahora puedo agregar algunos filtros en la línea de comandos para obtener los resultados de mayor calidad:
❯ ropr /usr/lib/libc.so.6 -m 2 -j -s -R "^mov eax, ...;"
0x000353e7: mov eax, eax; ret;
0x000788c8: mov eax, ecx; ret;
0x00052252: mov eax, edi; ret;
0x0003ae43: mov eax, edx; ret;
0x000353e6: mov eax, r8d; ret;
0x000788c7: mov eax, r9d; ret;
==> Found 6 gadgets in 0.046 seconds
Ahora tengo un buen candidato de gadget mov en la dirección 0x00052252