---
# System prepended metadata

title: Создание test-case для фаззинга ARGV

---

# Создание test-case для фаззинга ARGV

* Вызываем help/man программы, все флаги заносим в файл test.case и запускаем скрипт.

```
import os

if os.path.exists('test.case'):
    with open('test.case') as f:
        x = 1
        for line in f:
            line = line.rstrip()
            os.system("echo -en '{}\\x00' > {}".format(line, x))
            x = x + 1
else:
    print("File not found.")

```

# Передача crash программе

* **Получить hex символов crash файла**
```
hexdump -C id_crash
```

* **Передача содержимого crash-файла программе**
```
/usr/bin/programm $(echo $'hex_symbols')
```
Пример: `/usr/bin/bsign $(echo $'\x2d\x2d\x68\x65\x6c\x70')`

# AFL сборка под ARGV
testcase - создается в виде "флаг/x00"

### Arm сборка argvfuzz64.so
Открывем каталог
```
AFLplusplus/utils/argv_fuzzing
```

Там есть ```Makefile``` в нем надо закоментировать
```
M32FLAG = -m32
M664FLAG = -m64
```


### Если ЕСТЬ доступ к исходникам
* Библиотеку "argv-fuzz-inl.h" из utils AFL кладем рядом с файлом, где происходит считывание аргуметов. В Библиотеки меняем  ```rc = 0;``` на ```rc = 1;``` (86 строка)

* В файл добавляем заголовок
```
#include "argv-fuzz-inl.h"
```
* В main прописываем вот такую конструкцию(если не хотим менять 0 аргумент)
```
char p[] = "abc";
AFL_INIT_SET0(p);
```
* Собираем и прверяем. Для проверки запускаем программу, должно перекинуть в stdin, далее вводим например: --help + cntrl,shift,2 + cntrl,shift,2 + cntrl,d. Если все успешно, то должен вывестись хелп программы.

### Если НЕТ доступа к исходникам

Идем по пути ```/AFLplusplus/utils/argv_fuzzing``` и выполняем сбору библиотеки 

```
make argvfuzz64.so
```
Запусаемся в qemu(или другом) режиме ```-Q```
```
AFL_PRELOAD=path/to/argvfuzz64.so -i in -o out -Q -- programm
```

# Санитайзеры
Если очень много ошибок по какому-либо срабатыванию asan у него можно отключить некоторые проверки.

```
export ASAN_OPTIONS=detect_leaks=0
```
