-
-
Notifications
You must be signed in to change notification settings - Fork 125
/
fuzzer_linux_crash_test.cc
67 lines (53 loc) · 1.79 KB
/
fuzzer_linux_crash_test.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Jason Crowder - February 2024
#include "backend.h"
namespace linux_crash_test {
Crash_t GetCrashTestcaseName(const char *Prefix, Backend_t *Backend) {
return Crash_t(fmt::format("crash-{}-{:#x}", Prefix, Backend->Cr2()));
}
bool InsertTestcase(const uint8_t *Buffer, const size_t BufferSize) {
if (BufferSize > 10) {
return true;
}
if (!g_Backend->VirtWriteDirty(Gva_t(g_Backend->Rdi()), Buffer, BufferSize)) {
fmt::print("Failed to write payload.\n");
return false;
}
return true;
}
bool Init(const Options_t &Opts, const CpuState_t &) {
if (!g_Backend->SetBreakpoint("asm_exc_page_fault", [](Backend_t *Backend) {
Backend->Stop(GetCrashTestcaseName("asm_exc_page_fault", Backend));
})) {
fmt::print("Failed to insert crash breakpoint.\n");
return false;
}
if (!g_Backend->SetBreakpoint("asm_exc_divide_error", [](Backend_t *Backend) {
Backend->Stop(GetCrashTestcaseName("asm_exc_divide_error", Backend));
})) {
fmt::print("Failed to insert crash breakpoint.\n");
return false;
}
if (!g_Backend->SetBreakpoint("force_sigsegv", [](Backend_t *Backend) {
Backend->Stop(GetCrashTestcaseName("force_sigsegv", Backend));
})) {
fmt::print("Failed to insert crash breakpoint.\n");
return false;
}
if (!g_Backend->SetBreakpoint("page_fault_oops", [](Backend_t *Backend) {
Backend->Stop(GetCrashTestcaseName("page_fault_oops", Backend));
})) {
fmt::print("Failed to insert crash breakpoint.\n");
return false;
}
if (!g_Backend->SetBreakpoint("end_crash_test", [](Backend_t *Backend) {
Backend->Stop(Ok_t());
})) {
return false;
}
return true;
}
//
// Register the target.
//
Target_t linux_crash_test("linux_crash_test", Init, InsertTestcase);
} // namespace linux_crash_test