
Отображает информацию о файлах в различных форматах и находит гаджеты для построения ROP-цепочек для различных архитектур (x86/x86_64, ARM/ARM64, MIPS, PowerPC, SPARC64). Для дизассемблирования Ropper использует отличный фреймворк Capstone.
Вы можете использовать Ropper для отображения информации о бинарных файлах в различных форматах и для поиска гаджетов (gadgets) для построения ROP-цепочек под разные архитектуры (x86/X86_64, ARM/ARM64, MIPS/MIPS64, PowerPC/PowerPC64, SPARC64). Для дизассемблирования Ropper использует замечательный Capstone Framework.
Установите Capstone через PyPi:
$ sudo pip install capstone
Установите filebytes через PyPi:
$ sudo pip install filebytes
Опционально (не требуется для запуска Ropper, только для поиска гаджетов):
Установите Keystone:
$ sudo pip install keystone-engine
Установите и запустите Ropper
$ python setup.py install
$ ropper
Вы также можете установить Ropper с помощью pip
$ pip install ropper
Если хотите, можете использовать Ropper без установки
$ ./Ropper.py
Если вы не хотите устанавливать filebytes, filebytes является подмодулем репозитория ropper. Это означает, что вам не нужно устанавливать filebytes и ropper.
$ git clone https://github.com/sashs/ropper.git
$ cd ropper
$ git submodule init
$ git submodule update
$ ./Ropper.py
ЭТА ФУНКЦИЯ ВСЕ ЕЩЁ В РАЗРАБОТКЕ! Ropper имеет команду семантического поиска, которая предоставляет возможность искать гаджеты.
$ ropper --file <afile> --semantic "<any constraint>"
Для использования семантического поиска необходимы следующие опциональные зависимости:
Установите pyvex
$ sudo pip install pyvex
Установите z3py
$ python scripts/mk_make.py
$ cd build
$ make
$ sudo make install
reg == reg - присвоить регистру другой
reg == number - присвоить число регистру
reg == [reg] - присвоить память регистру
reg += number/reg/[reg]
reg -= number/reg/[reg]
reg *= number/reg/[reg]
reg /= number/reg/[reg]
eax==1 !ebx - установить eax в 1 и искать гаджеты, которые не портят ebx

usage: Ropper.py [-h] [--help-examples] [-v] [--console]
[-f <file> [<file> ...]] [-r] [-a <arch>]
[--section <section>] [--string [<string>]] [--hex]
[--asm [<asm> [H|S|R] ...]] [--disasm <opcode>]
[--disassemble-address <address:length>] [-i] [-e]
[--imagebase] [-c] [-s] [-S] [--imports] [--symbols]
[--set <option>] [--unset <option>] [-I <imagebase>] [-p]
[-j <reg>] [--stack-pivot] [--inst-count <n bytes>]
[--search <regex>] [--quality <quality>] [--opcode <opcode>]
[--instructions <instructions>] [--type <type>] [--detailed]
[--all] [--cfg-only] [--chain <generator>] [-b <badbytes>]
[--nocolor] [--clear-cache] [--no-load] [--analyse <quality>]
[--semantic constraint]
[--count-of-findings <count of gadgets>] [--single]
Вы можете использовать Ropper для отображения информации о бинарных файлах в различных форматах
и для поиска гаджетов для построения ROP-цепочек под разные архитектуры
поддерживаемые типы файлов:
ELF
PE
Mach-O
Raw
поддерживаемые архитектуры:
x86 [x86]
x86_64 [x86_64]
MIPS [MIPS, MIPS64]
ARM/Thumb [ARM, ARMTHUMB]
ARM64 [ARM64]
PowerPC [PPC, PPC64]
SPARC [SPARC64]
доступные генераторы ROP-цепочек:
execve (execve[=<команда>], по умолчанию /bin/sh) [Linux x86, x86_64]
mprotect (mprotect=<адрес>:<размер>) [Linux x86, x86_64]
virtualprotect (virtualprotect=<адрес iat vp>:<размер>) [Windows x86]
опции:
-h, --help показать это справочное сообщение и выйти
--help-examples Показать примеры
-v, --version Показать версию
--console Запускает интерактивную командную строку
-f <file> [<file> ...], --file <file> [<file> ...]
Файл для загрузки
-r, --raw Загружает файл как сырой (raw)
-a <arch>, --arch <arch>
Архитектура загруженного файла
--section <section> Данные указанной секции будут выведены
--string [<string>] Ищет строку <string> во всех секциях данных
--hex Выводит выбранные секции в шестнадцатеричном формате
--asm [<asm> [H|S|R] ...]
Строка для ассемблирования и формат вывода
(H=HEX, S=STRING, R=RAW, по умолчанию: H)
--disasm <opcode> Опкод для дизассемблирования (например, ffe4, 89c8c3, ...)
--disassemble-address <address:length>
Дизассемблирует инструкцию по адресу <address>
(0x12345678:L3). Можно указать количество инструкций
для дизассемблирования (0x....:L...)
-i, --info Показывает заголовок файла [ELF/PE/Mach-O]
-e Показывает точку входа
--imagebase Показывает ImageBase [ELF/PE/Mach-O]
-c, --dllcharacteristics
Показывает DllCharacteristics [PE]
-s, --sections Показывает секции файла [ELF/PE/Mach-O]
-S, --segments Показывает сегменты файла [ELF/Mach-O]
--imports Показывает импорты [ELF/PE]
--symbols Показывает символы [ELF]
--set <option> Устанавливает опции. Доступные опции: aslr nx
--unset <option> Снимает опции. Доступные опции: aslr nx
-I <imagebase> Использовать этот ImageBase для гаджетов
-p, --ppr Ищет инструкции 'pop reg; pop reg; ret'
[только x86/x86_64]
-j <reg>, --jmp <reg>
Ищет инструкции 'jmp reg' (-j reg[,reg...])
[только x86/x86_64]
--stack-pivot Выводит все гаджеты stack pivot
--inst-count <n bytes>
Указывает максимальное количество инструкций в гаджете
(по умолчанию: 6)
--search <regex> Ищет гаджеты
--quality <quality> Качество гаджетов, найденных поиском (1 =
наилучшее)
--opcode <opcode> Ищет опкоды (например, ffe4 или ffe? или ff??)
--instructions <instructions>
Ищет инструкции (например, "jmp esp", "pop eax;
ret")
--type <type> Устанавливает тип гаджетов [rop, jop, sys, all]
(по умолчанию: all)
--detailed Выводит гаджеты более подробно
--all Не удаляет дублирующиеся гаджеты
--cfg-only Отфильтровывает гаджеты, не прошедшие проверку Microsoft CFG.
Только для PE-файлов, скомпилированных с включённой проверкой CFG
(см. DllCharachteristics) [PE]
--chain <generator> Генерирует ROP-цепочку [параметр генератора=значение[
параметр=значение]]
-b <badbytes>, --badbytes <badbytes>
Устанавливает байты, которые не должны содержаться в гаджетах
--nocolor Отключает цветной вывод
--clear-cache Очищает кэш
--no-load Не загружать гаджеты автоматически при запуске консоли
(--console)
--analyse <quality> Используется только для реализации семантического поиска
--semantic constraint
Семантический поиск гаджетов
--count-of-findings <count of gadgets>
Максимальное количество выводимых гаджетов при семантическом поиске
(0 = неограниченно, по умолчанию: 5)
--single Не использовать множественные процессы для сканирования гаджетов
примеры использования:
[Generic]
./Ropper.py
./Ropper.py --file /bin/ls --console
[Informations]
./Ropper.py --file /bin/ls --info
./Ropper.py --file /bin/ls --imports
./Ropper.py --file /bin/ls --sections
./Ropper.py --file /bin/ls --segments
./Ropper.py --file /bin/ls --set nx
./Ropper.py --file /bin/ls --unset nx
./Ropper.py --file /bin/ls --inst-count 5
./Ropper.py --file /bin/ls --search "sub eax" --badbytes 000a0d
./Ropper.py --file /bin/ls --search "sub eax" --detail
./Ropper.py --file /bin/ls --filter "sub eax"
./Ropper.py --file /bin/ls --inst-count 5 --filter "sub eax"
./Ropper.py --file /bin/ls --opcode ffe4
./Ropper.py --file /bin/ls --opcode ffe?
./Ropper.py --file /bin/ls --opcode ??e4
./Ropper.py --file /bin/ls --detailed
./Ropper.py --file /bin/ls --ppr --nocolor
./Ropper.py --file /bin/ls --jmp esp,eax
./Ropper.py --file /bin/ls --type jop
./Ropper.py --file /bin/ls --chain execve
./Ropper.py --file /bin/ls --chain "execve cmd=/bin/sh" --badbytes 000a0d
./Ropper.py --file /bin/ls --chain "mprotect address=0xbfdff000 size=0x21000"
./Ropper.py --file /bin/ls /lib/libc.so.6 --console
[Assemble/Disassemble]
./Ropper.py --asm "jmp esp"
./Ropper.py --asm "mov eax, ecx; ret"
./Ropper.py --disasm ffe4
[Search]
./Ropper.py --file /bin/ls --search <searchstring>
? любой символ
% любая строка
Пример:
./Ropper.py --file /bin/ls --search "mov e?x"
0x000067f1: mov edx, dword ptr [ebp + 0x14]; mov dword ptr [esp], edx; call eax
0x00006d03: mov eax, esi; pop ebx; pop esi; pop edi; pop ebp; ret ;
0x00006d6f: mov ebx, esi; mov esi, dword ptr [esp + 0x18]; add esp, 0x1c; ret ;
0x000076f8: mov eax, dword ptr [eax]; mov byte ptr [eax + edx], 0; add esp, 0x18; pop ebx; ret ;
./Ropper.py --file /bin/ls --search "mov [%], edx"
0x000067ed: mov dword ptr [esp + 4], edx; mov edx, dword ptr [ebp + 0x14]; mov dword ptr [esp], edx; call eax;
0x00006f4e: mov dword ptr [ecx + 0x14], edx; add esp, 0x2c; pop ebx; pop esi; pop edi; pop ebp; ret ;
0x000084b8: mov dword ptr [eax], edx; ret ;
0x00008d9b: mov dword ptr [eax], edx; add esp, 0x18; pop ebx; ret ;
./Ropper.py --file /bin/ls --search "mov [%], edx" --quality 1
0x000084b8: mov dword ptr [eax], edx; ret ;; ret ;
#!/usr/bin/env python
from ropper import RopperService
# не все параметры обязательны
options = {'color' : False, # при выводе гаджетов использовать цветной вывод: по умолчанию: False
'badbytes': '00', # плохие байты, которые не должны быть в адресах или ROP-цепочках; по умолчанию: ''
'all' : False, # Показывать все гаджеты, то есть не удалять дублирующиеся; по умолчанию: False
'inst_count' : 6, # Количество инструкций в гаджете; по умолчанию: 6
'type' : 'all', # rop, jop, sys, all; по умолчанию: all
'detailed' : False} # при выводе гаджетов использовать подробный вывод; по умолчанию: False
rs = RopperService(options)
##### изменение параметров ######
rs.options.color = True
rs.options.badbytes = '00'
rs.options.badbytes = ''
rs.options.all = True
##### открытие бинарных файлов ######
# можно открыть несколько файлов
rs.addFile('test-binaries/ls-x86')
rs.addFile('ls', bytes=open('test-binaries/ls-x86','rb').read()) # другой способ
rs.addFile('ls_raw', bytes=open('test-binaries/ls-x86','rb').read(), raw=True, arch='x86')
##### закрытие бинарных файлов ######
rs.removeFile('ls')
rs.removeFile('ls_raw')
# Установка архитектуры бинарного файла, чтобы можно было искать гаджеты для другой архитектуры
# Полезно для ARM, если нужно искать гаджеты ARM или Thumb
# Или если открыт сырой (raw) файл
ls = 'test-binaries/ls-x86'
rs.setArchitectureFor(name=ls, arch='x86')
rs.setArchitectureFor(name=ls, arch='x86_64')
rs.setArchitectureFor(name=ls, arch='ARM')
rs.setArchitectureFor(name=ls, arch='ARMTHUMB')
rs.setArchitectureFor(name=ls, arch='ARM64')
rs.setArchitectureFor(name=ls, arch='MIPS')
rs.setArchitectureFor(name=ls, arch='MIPS64')
rs.setArchitectureFor(name=ls, arch='PPC')
rs.setArchitectureFor(name=ls, arch='PPC64')
rs.setArchitectureFor(name=ls, arch='SPARC64')
rs.setArchitectureFor(name=ls, arch='x86')
##### загрузка гаджетов ######
# загрузить гаджеты для всех открытых файлов
rs.loadGadgetsFor()
# загрузить гаджеты только для одного открытого файла
ls = 'test-binaries/ls-x86'
rs.loadGadgetsFor(name=ls)
# изменить тип гаджетов
rs.options.type = 'jop'
rs.loadGadgetsFor()
rs.options.type = 'rop'
rs.loadGadgetsFor()
# изменить количество инструкций
rs.options.inst_count = 10
rs.loadGadgetsFor()
##### вывод гаджетов #######
rs.printGadgetsFor() # вывести все гаджеты
rs.printGadgetsFor(name=ls)
##### получение гаджетов ######
gadgets = rs.getFileFor(name=ls).gadgets
##### поиск pop pop ret ######
pprs = rs.searchPopPopRet(name=ls) # ищет ppr только в 'test-binaries/ls-x86'
pprs = rs.searchPopPopRet() # ищет ppr во всех открытых файлах
for file, ppr in pprs.items():
for p in ppr:
print p
##### загрузка jmp reg ######
jmp_regs = rs.searchJmpReg(name=ls, regs=['esp', 'eax']) # ищет jmp reg только в 'test-binaries/ls-x86'
jmp_regs = rs.searchJmpReg(regs=['esp', 'eax'])
jmp_regs = rs.searchJmpReg() # ищет jmp esp во всех открытых файлах
for file, jmp_reg in jmp_regs.items():
for j in jmp_reg:
print j
##### поиск опкода ######
ls = 'test-binaries/ls-x86'
gadgets_dict = rs.searchOpcode(opcode='ffe4', name=ls)
gadgets_dict = rs.searchOpcode(opcode='ffe?')
gadgets_dict = rs.searchOpcode(opcode='??e4')
for file, gadgets in gadgets_dict.items():
for g in gadgets:
print g
##### поиск инструкций ######
ls = 'test-binaries/ls-x86'
for file, gadget in rs.search(search='mov e?x', name=ls):
print file, gadget
for file, gadget in rs.search(search='mov [e?x%]'):
print file, gadget
result_dict = rs.searchdict(search='mov eax')
for file, gadgets in result_dict.items():
print file
for gadget in gadgets:
print gadget
##### ассемблирование инструкций ######
hex_string = rs.asm('jmp esp')
print '"jmp esp" assembled to hex string =', hex_string
raw_bytes = rs.asm('jmp esp', format='raw')
print '"jmp esp" assembled to raw bytes =', raw_bytes
string = rs.asm('jmp esp', format='string')
print '"jmp esp" assembled to string =',string
arm_bytes = rs.asm('bx sp', arch='ARM')
print '"bx sp" assembled to hex string =', arm_bytes
##### дизассемблирование байтов #######
arm_instructions = rs.disasm(arm_bytes, arch='ARM')
print arm_bytes, 'disassembled to "%s"' % arm_instructions
# Изменение ImageBase, также изменит ImageBase для всех загруженных гаджетов этого бинарного файла
rs.setImageBaseFor(name=ls, imagebase=0x0)
# сброс ImageBase
rs.setImageBaseFor(name=ls, imagebase=None)
gadgets = rs.getFileFor(name=ls).gadgets
# адрес гаджета
print hex(gadgets[0].address)
# получить байты инструкции гаджета
print bytes(gadgets[0].bytes).encode('hex')
# удалить все гаджеты, содержащие плохие байты в адресе
rs.options.badbytes = '000a0d' # гаджеты фильтруются автоматически






