-
Notifications
You must be signed in to change notification settings - Fork 15
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
157 changed files
with
655 additions
and
235 deletions.
There are no files selected for viewing
File renamed without changes.
157 changes: 74 additions & 83 deletions
157
Examples/Linux/OpenSSL/README.md → Examples/Crusher/Linux/OpenSSL/README.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,83 +1,74 @@ | ||
Нахождение аварийного завершения OpenSSL-сервера, соответствующего уязвимости `CVE-2016-6309`. | ||
|
||
Демонстрируются следующие возможности фаззера: | ||
|
||
1) Описание формата данных с помощью `Peach Pit` (модифицированного для `Crusher`); | ||
|
||
2) Замена вызовов некоторых функций целевой программы пользовательскими во время фаззинга. | ||
Т.к. речь идёт о сетевых функциях, которые работают медленно - обеспечивается ускорение запусков в десятки раз. | ||
Более подробно - см. раздел `"PRELOAD"` в документации фаззера. | ||
|
||
Ниже представлены все этапы от подготовки к фаззингу до воспроизведения креша. | ||
|
||
# Сборка OpenSSL со статической инструментацией | ||
Выполните команды в терминале (обратите внимание, что нужно указать актуальный путь до фаззера): | ||
```bash | ||
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_0a.tar.gz | ||
tar xvf OpenSSL_1_1_0a.tar.gz | ||
mkdir openssl | ||
cd openssl-OpenSSL_1_1_0a | ||
CC=/path/to/crusher/bin_x86-64/isp-gcc ./config --prefix=$PWD/../openssl/ | ||
make -j 4 | ||
make install | ||
cd .. | ||
``` | ||
|
||
# Генерация SSL-сертификатов | ||
```bash | ||
mkdir keys | ||
./openssl/bin/openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout keys/key.pem -out keys/cert.pem -batch | ||
``` | ||
|
||
# Фаззинг | ||
Скомпилировать разделяемую библиотеку для замены некоторых сетевых функций (для ускорения фаззинга): | ||
```bash | ||
cd custom_lib/ | ||
make | ||
cd .. | ||
``` | ||
|
||
Для правильного детектирования аварийных завершений целевой программы со статической инструментацией выполнить: | ||
```bash | ||
sudo su | ||
echo core >/proc/sys/kernel/core_pattern | ||
exit | ||
``` | ||
|
||
Запустить фаззинг (`"-c 4"` - запуск на 4 ядрах): | ||
```bash | ||
ISP_PRELOAD=$PWD/custom_lib/custom_lib.so ./fuzz.sh -f /path/to/crusher/bin_x86-64/fuzz_manager -c 4 | ||
``` | ||
|
||
Запустить в другом терминале UI фаззера: | ||
```bash | ||
/path/to/crusher/bin_x86-64/ui -o out | ||
``` | ||
|
||
В правом верхнем углу окна пользовательского интерфейса можно наблюдать окно `Stats`. В нём обратите внимание на поле `unique_crashes`. | ||
Как только будет найдено аварийное завершение, значение поля `unique_crashes` станет ненулевым. Пока значение поля нулевое - не останавливайте фаззинг. | ||
Желательно дождаться, когда значение поля будет больше 1. После этого можно остановить фаззинг: | ||
|
||
* в терминале с `UI` (пользовательский интерфейс) - для выхода из `UI` нажмите кнопку `q`; | ||
* в терминале с запущенным фаззингом завершите фаззинг по комбинации клавиш `Ctrl+C`. | ||
|
||
# Воспроизведение аварийного завершения | ||
1) Получить список креш-файлов: | ||
```bash | ||
find out -name id_crash_* | ||
``` | ||
|
||
2) Запуск сервера (будет слушать порт 4444): | ||
````bash | ||
./run_server.sh | ||
```` | ||
|
||
3) Запуск клиента (в другом терминале): | ||
```bash | ||
python run_client.py --ip 127.0.0.1 --port 4444 --crash-path <crash_path> | ||
``` | ||
|
||
где `<crash_path>` - один из файлов, полученных в п. 1) | ||
|
||
4) В терминале с сервером наблюдаем его аварийное завершение. | ||
Если аварийного завершения не произошло, то повторяем п. 3) с другим файлом из п. 1) | ||
Нахождение аварийного завершения OpenSSL-сервера, соответствующего уязвимости CVE-2016-6309. | ||
|
||
Демонстрируются следующие возможности фаззера: | ||
|
||
1) Описание формата данных с помощью Peach Pit (модифицированного для Crusher). | ||
|
||
2) Замена вызовов некоторых функций целевой программы пользовательскими во время фаззинга. | ||
Т.к. речь идёт о сетевых функциях, которые работают медленно - обеспечивается ускорение запусков в десятки раз. | ||
Более подробно - см. раздел `"PRELOAD"` в документации фаззера. | ||
|
||
Ниже представлены все этапы от подготовки к фаззингу до воспроизведения креша. | ||
|
||
# Подготовка OpenSSL сервера для фаззинга | ||
Включает следующие этапы: | ||
1) Сборка компилятора для статической инструментации OpenSSL. | ||
`Crusher` совместим со статической инструментацией, реализованной в `AFL++`. | ||
На этом этапе скачивается и собирается `AFL++` - в нём будет нужен только `afl-gcc`. | ||
2) Сборка OpenSSL со статической инструментацией. | ||
Скачивается (уязвимая) версия OpenSSL v1.1.0a и собирается с помощью `afl-gcc`. | ||
3) Генерация SSL-сертификата и ключа. | ||
Необходимы для работы OpenSSL сервера. | ||
4) Компиляция разделяемой библиотеки для замены некоторых сетевых функций (для ускорения фаззинга). | ||
|
||
Для выполнения этих действий запустите: | ||
```shell | ||
./build.sh | ||
``` | ||
|
||
# Запуск фаззинга | ||
Для правильного детектирования аварийных завершений целевой программы со статической инструментацией выполнить: | ||
```shell | ||
sudo su | ||
echo core >/proc/sys/kernel/core_pattern | ||
exit | ||
``` | ||
|
||
Запустите фаззинг через `fuzz.sh`, указав путь до `fuzz_manager` (опция `-f`) и число ядер для фаззинга (опция `-c`): | ||
```shell | ||
ISP_PRELOAD=$PWD/custom_lib/custom_lib.so ./fuzz.sh -f /path/to/crusher/bin_x86-64/fuzz_manager -c 4 | ||
``` | ||
|
||
# Мониторинг фаззинга | ||
Запустите в другом терминале UI фаззера: | ||
```shell | ||
/path/to/crusher/bin_x86-64/ui -o out | ||
``` | ||
|
||
В правом верхнем углу окна пользовательского интерфейса можно наблюдать окно `Stats`. В нём обратите внимание на поле `unique_crashes`. | ||
Как только будет найдено аварийное завершение, значение поля `unique_crashes` станет ненулевым. Пока значение поля нулевое - не останавливайте фаззинг. | ||
Желательно дождаться, когда значение поля будет больше 1. После этого можно остановить фаззинг: | ||
|
||
* в терминале с `UI` (пользовательский интерфейс) - для выхода из `UI` нажмите кнопку `q`; | ||
* в терминале с запущенным фаззингом завершите фаззинг по комбинации клавиш `Ctrl+C`. | ||
|
||
# Воспроизведение аварийного завершения | ||
1) Получить список креш-файлов: | ||
```shell | ||
find out -name id_crash_* | ||
``` | ||
|
||
2) Запуск сервера (будет слушать порт 4444): | ||
````shell | ||
./run_server.sh | ||
```` | ||
|
||
3) Запуск клиента (в другом терминале): | ||
```shell | ||
python run_client.py --ip 127.0.0.1 --port 4444 --crash-path <crash_path> | ||
``` | ||
|
||
где `<crash_path>` - один из файлов, полученных в п. 1) | ||
|
||
4) В терминале с сервером наблюдаем его аварийное завершение. | ||
Если аварийного завершения не произошло, то повторяем п. 3) с другим файлом из п. 1) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
# Download & build afl-gcc | ||
wget https://github.com/AFLplusplus/AFLplusplus/archive/3.0c.tar.gz | ||
tar xvf 3.0c.tar.gz | ||
cd AFLplusplus-3.0c/ | ||
make -j4 | ||
cd .. | ||
|
||
# Build OpenSSL | ||
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_0a.tar.gz | ||
tar xvf OpenSSL_1_1_0a.tar.gz | ||
mkdir openssl | ||
cd openssl-OpenSSL_1_1_0a | ||
CC=../AFLplusplus-3.0c/afl-gcc ./config --prefix=$PWD/../openssl/ no-shared | ||
make -j4 | ||
make install | ||
cd .. | ||
|
||
# Create SSL certificate & key | ||
mkdir keys | ||
./openssl/bin/openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout keys/key.pem -out keys/cert.pem -batch | ||
|
||
# Compile custom library (for ISP_PRELOAD) | ||
cd custom_lib/ | ||
make | ||
cd - |
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
# Общее описание | ||
|
||
Этот пример показывает фаззинг встраиваемого ПО архитектуры `x86-32` | ||
на основе частичной эмуляции с помощью модифицированной `QEMU` и скриптов на языке `Lua`. | ||
|
||
В поддиректории `firmware` находится тестируемое ПО (исходный и бинарный код). | ||
В поддиректории `testing` - скрипты и материалы для запуска частичной эмуляции и фаззинга. | ||
|
||
# Сборка | ||
|
||
```shell | ||
cd firmware | ||
./build.sh | ||
cd .. | ||
``` | ||
|
||
В ходе эмуляции выполняется функция `func` | ||
|
||
# Фаззинг | ||
|
||
Находясь в директории `testing/`, запустить скрипт `./fuzz.sh`; | ||
он принимает один аргумент - путь до `fuzz_manager`. | ||
|
||
Запустить в другом терминале `UI` фаззера (укажите актуальные пути): | ||
```shell | ||
/path/to/crusher/bin_x86-64/ui --outdir /path/to/out | ||
``` | ||
|
||
Как только будут найдены аварийные завершения, значение поля `unique_crashes` (в окне `UI` - наверху справа) станет ненулевым. | ||
|
||
Прервать фаззинг (в первом терминале, `Ctrl + C`). | ||
|
||
В данном примере фаззер обнаруживает два уникальных аварийных завершения, | ||
соответствующие двум дефектам в ПО (см. исходный код). | ||
|
||
# Эмуляция | ||
|
||
Для запуска эмуляции - скрипт `./emulate.sh`; | ||
он принимает один аргумент - путь до исполняемого файла `QEMU`; | ||
входные данные находятся в файле `input`. | ||
|
||
QEMU x86-32: `/path/to/crusher/bin_x86-64/QIT/QemuX86/qemu-system-i386` | ||
|
||
# Воспроизведение аварийного завершения | ||
|
||
Записать найденные фаззером вх.данные ав.завершения (например, `out/EAT_OUT/crashes/id_crash_0`) | ||
в файл `input` и запустить эмуляцию (как описано выше). | ||
В случае ав.завершения, т.е. при возникновении исключения, | ||
будет напечатана информация об этом исключении | ||
(слово `Exception`, значения регистров в этот момент и т.п.) | ||
|
||
Более подробное описание см. в документации. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
gcc -m32 -c -no-pie -fno-pic test.c && \ | ||
ld -m elf_i386 -T test.ld test.o -o test.elf && \ | ||
objcopy -O binary test.elf test.bin && \ | ||
echo "OK" |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
|
||
void f(void) { | ||
return; | ||
} | ||
|
||
void func(char *input) { | ||
int *ptr = 0x41414141; | ||
if (input[0] % 3 == 1) { | ||
*ptr = 1; | ||
} | ||
if (input[0] % 3 == 2) { | ||
*ptr = 2; | ||
} | ||
} | ||
|
||
void entry() | ||
{ | ||
func(0x20002000); | ||
while(1); | ||
} | ||
|
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
|
||
|
||
SECTIONS | ||
{ | ||
|
||
. = 0x08000000; | ||
.text : { *(.text) } | ||
.data : { *(.data) } | ||
.bss : { *(.bss) } | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
c |
Oops, something went wrong.