# Создание 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
```