Skip to content

Commit a377e5b

Browse files
gfaridaFarida
andauthored
C# instrumentation for Windows (#36)
* C# instrumentation fo windows * update README * update README * fix batch script * fix batch script * fix batch script * fix dll file * fix dll file * delete dlls * add dlls * delete dlls * added libraries * fix program.cs * added Windows directory * fix readme Co-authored-by: Farida <farida@star.intra.ispras.ru>
1 parent 2b73d1c commit a377e5b

File tree

12 files changed

+224
-0
lines changed

12 files changed

+224
-0
lines changed

Examples/Crusher/Linux/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
10) [partial_emulation](partial_emulation) - пример частичной эмуляции с помощью модуля DualEmu, комбинирующего фаззинг с помощью unicornafl и DSE с Angr;
1414
11) [java](java) - фаззинг JAVA приложения через файл
1515
12) [python_fuzz](python_fuzz) - фаззинг библиотеки на языке python
16+
1617
Далее приведена последовательность действий по фаззингу, мониторингу и воспроизведению аварийных завершений (крешей) для следующих примеров: `python`, `jasper` и `faad`.
1718
13) [c#](csharp) - фаззинг dll библиотек, написанных на C#, через файл и stdin
1819

Examples/Crusher/Windows/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
## Набор примеров
2+
Набор примеров фаззинга на Windows, в которых демонстрируется часть функционала `Crusher`:
3+
4+
1) [windows_csharp](win_csharp) - фаззинг библиотеки на языке C#.
5+
6+
7+
Подробную инструкцию можно найти в файле `README.md` в соответствующей директории.
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# Общее описание
2+
3+
Этот пример показывает фаззинг dll библиотек, написанных на C#.
4+
5+
# Создание проекта - обертки
6+
1. В корень проекта ExampleWrapperProject положите библиотеку, которую Вы хотите пофазззить.
7+
В файле ExampleWrapperProject.csproj пропишите соответствующую зависимость. В примере это `AngleSharp.dll`
8+
9+
2. В файле `Program.cs`, в качестве аргумента функции `Run` передайте лямбда-функцию (см. пример ниже),
10+
в которой Вы вызываете функцию из тестируемой библиотеки (в примере - функция `Parse()` библиотеки `AngleSharp`).
11+
12+
3. В директории `win_csharp/target/AngleSharp.Fuzz.File` лежат 3 dll библиотеки: SharpFuzz.dll, SharpFuzz.CommandLine.dll,
13+
SharpFuzz.Common.dll. Они были добавлены в Ваш проект-обертку в качестве зависимостей, были прописаны соотвествующие
14+
строки в файле `ExampleWrapperProject.csproj` (см. пример ниже). Здесь находится функция для запуска Вашей библиотеки (проекта-обертки)
15+
и собирается проект-обертка как dll файл.
16+
17+
Фаззинг происходит через **файл**, работаем с первым аргументом командной строки - `args[0]`. Ниже
18+
приведен пример файла `Program.cs`:
19+
20+
```c++
21+
using System;
22+
using AngleSharp.Parser.Html;
23+
using AngleSharp;
24+
using SharpFuzz;
25+
26+
namespace AngleSharp.Fuzz
27+
{
28+
public class Program
29+
{
30+
public static void Main(string[] args)
31+
{
32+
Fuzzer.LibFuzzer.Run(stream =>
33+
{
34+
try
35+
{
36+
var html = File.ReadAllText(args[0]);
37+
new HtmlParser().Parse(html);
38+
}
39+
catch (InvalidOperationException) { }
40+
});
41+
}
42+
}
43+
}
44+
45+
```
46+
47+
Пример файла `ExampleWrapperProject.csproj`:
48+
49+
```xml
50+
<Project Sdk="Microsoft.NET.Sdk">
51+
52+
<PropertyGroup>
53+
<OutputType>Exe</OutputType>
54+
<TargetFramework>net6.0</TargetFramework>
55+
<ImplicitUsings>enable</ImplicitUsings>
56+
</PropertyGroup>
57+
58+
<ItemGroup>
59+
<Reference Include="AngleSharp">
60+
<HintPath>AngleSharp.dll</HintPath>
61+
</Reference>
62+
</ItemGroup>
63+
64+
<ItemGroup>
65+
<Reference Include="SharpFuzz">
66+
<HintPath>SharpFuzz.dll</HintPath>
67+
</Reference>
68+
</ItemGroup>
69+
70+
<ItemGroup>
71+
<Reference Include="SharpFuzz.CommandLine">
72+
<HintPath>SharpFuzz.CommandLine.dll</HintPath>
73+
</Reference>
74+
</ItemGroup>
75+
76+
77+
<ItemGroup>
78+
<Reference Include="SharpFuzz.Common">
79+
<HintPath>SharpFuzz.Common.dll</HintPath>
80+
</Reference>
81+
</ItemGroup>
82+
83+
84+
</Project>
85+
```
86+
87+
3. Произведите инструментацию библиотеки для фаззинга. Соберите проект-обертку. Для этого
88+
запустите скрипт `instrument.bat`, который принимает один аргумент - путь до `dotnet.exe`.
89+
90+
В данном примере проект-обертка (фаззинг через файл) находится в директории `target`.
91+
92+
93+
# Фаззинг
94+
95+
Находясь в данной директории, запустите скрипт `fuzz.bat` для фаззинга библиотеки через **файл**;
96+
он принимаtт два аргумента - путь до `fuzz_manager.exe` и до `dotnet.exe`, установленного в Вашей системе.
97+
98+
Запустите в другом терминале `UI` фаззера (укажите актуальные пути):
99+
```shell
100+
/path/to/crusher/bin_x86-64/ui.exe --outdir /path/to/out
101+
```
102+
103+
Как только будут найдены аварийные завершения, значение поля `unique_crashes` (в окне `UI` - наверху справа) станет ненулевым.
104+
105+
Прервать фаззинг (в первом терминале, `Ctrl + С`)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
@echo off
2+
setlocal enabledelayedexpansion
3+
4+
set SOURCE_DIR=%~dp0
5+
6+
set argC=0
7+
for %%x in (%*) do (
8+
set /A argC+=1
9+
)
10+
11+
if %argC% LSS 2 (
12+
echo Usage: build.bat \\path\\to\\fuzz_manager \\path\\to\\dotnet.exe
13+
goto finish
14+
)
15+
16+
set FUZZ_MAN=%1
17+
set DOTNET=%2
18+
19+
%FUZZ_MAN% --start 4 -F -i in -o out -I csharp --no-default-close-app --dotnet %DOTNET% -- .\\target\\AngleSharp.Fuzz.File\\bin\\Debug\\net6.0\\AngleSharp.Fuzz.File.dll __DATA__
20+
21+
:finish
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
hello, world!
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
@echo off
2+
setlocal enabledelayedexpansion
3+
4+
set SOURCE_DIR=%~dp0
5+
6+
set argC=0
7+
for %%x in (%*) do (
8+
set /A argC+=1
9+
)
10+
11+
if %argC% LSS 1 (
12+
echo Usage: build.bat \\path\\to\\dotnet.exe
13+
goto finish
14+
)
15+
16+
set DOTNET=%1
17+
18+
echo Installing SharpFuzz.CommandLine .NET tool...
19+
%DOTNET% tool install SharpFuzz.CommandLine --version 2.0.0 --tool-path %SOURCE_DIR%
20+
21+
set x=0
22+
23+
echo Instrumenting libraries...
24+
%SOURCE_DIR%\sharpfuzz.exe .\\target\\AngleSharp.Fuzz.File\\AngleSharp.dll
25+
26+
27+
echo Building project...
28+
cd .\\target\\AngleSharp.Fuzz.File
29+
%DOTNET% build
30+
cd ..\..
31+
32+
:finish
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net6.0</TargetFramework>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<Reference Include="AngleSharp">
11+
<HintPath>AngleSharp.dll</HintPath>
12+
</Reference>
13+
</ItemGroup>
14+
15+
<ItemGroup>
16+
<Reference Include="SharpFuzz">
17+
<HintPath>SharpFuzz.dll</HintPath>
18+
</Reference>
19+
</ItemGroup>
20+
21+
<ItemGroup>
22+
<Reference Include="SharpFuzz.CommandLine">
23+
<HintPath>SharpFuzz.CommandLine.dll</HintPath>
24+
</Reference>
25+
</ItemGroup>
26+
27+
28+
<ItemGroup>
29+
<Reference Include="SharpFuzz.Common">
30+
<HintPath>SharpFuzz.Common.dll</HintPath>
31+
</Reference>
32+
</ItemGroup>
33+
34+
</Project>
Binary file not shown.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System;
2+
using AngleSharp.Parser.Html;
3+
using AngleSharp;
4+
using SharpFuzz;
5+
6+
namespace AngleSharp.Fuzz
7+
{
8+
public class Program
9+
{
10+
public static void Main(string[] args)
11+
{
12+
Fuzzer.LibFuzzer.Run(stream =>
13+
{
14+
try
15+
{
16+
var html = File.ReadAllText(args[0]);
17+
new HtmlParser().Parse(html);
18+
}
19+
catch (InvalidOperationException) { }
20+
});
21+
}
22+
}
23+
}

0 commit comments

Comments
 (0)