Skip to content

Commit 4df4d2d

Browse files
authored
Add crash exit request (#106)
* add crash exit request. * make it possible to choose between crashing methods
1 parent 0b9d826 commit 4df4d2d

File tree

5 files changed

+45
-7
lines changed

5 files changed

+45
-7
lines changed

include/libafl/exit.h

+8-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ enum libafl_exit_reason_kind {
1414
INTERNAL = 0,
1515
BREAKPOINT = 1,
1616
CUSTOM_INSN = 2,
17-
TIMEOUT = 3,
17+
CRASH = 3,
18+
TIMEOUT = 4,
1819
};
1920

2021
enum libafl_custom_insn_kind {
@@ -39,6 +40,10 @@ struct libafl_exit_reason_custom_insn {
3940
enum libafl_custom_insn_kind kind;
4041
};
4142

43+
// A timeout occured and we were asked to exit on timeout
44+
struct libafl_exit_reason_crash {
45+
};
46+
4247
// A timeout occured and we were asked to exit on timeout
4348
struct libafl_exit_reason_timeout {
4449
};
@@ -52,6 +57,7 @@ struct libafl_exit_reason {
5257
struct libafl_exit_reason_breakpoint breakpoint; // kind == BREAKPOINT
5358
struct libafl_exit_reason_custom_insn
5459
custom_insn; // kind == CUSTOM_INSN
60+
struct libafl_exit_reason_crash crash; // kind == CRASH
5561
struct libafl_exit_reason_timeout timeout; // kind == TIMEOUT
5662
} data;
5763
};
@@ -74,9 +80,7 @@ void libafl_exit_request_internal(CPUState* cpu, uint64_t pc,
7480
void libafl_exit_request_breakpoint(CPUState* cpu, target_ulong pc);
7581
void libafl_exit_request_custom_insn(CPUState* cpu, target_ulong pc,
7682
enum libafl_custom_insn_kind kind);
77-
78-
#ifndef CONFIG_USER_ONLY
83+
void libafl_exit_request_crash(CPUState* cpu);
7984
void libafl_exit_request_timeout(void);
80-
#endif
8185

8286
struct libafl_exit_reason* libafl_get_exit_reason(void);

include/libafl/user.h

+3
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ uint64_t libafl_set_brk(uint64_t new_brk);
4949

5050
int _libafl_qemu_user_init(int argc, char** argv, char** envp);
5151

52+
bool libafl_get_return_on_crash(void);
53+
void libafl_set_return_on_crash(bool return_on_crash);
54+
5255
#ifdef AS_LIB
5356
void libafl_qemu_init(int argc, char** argv);
5457
#endif

libafl/exit.c

+11
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,17 @@ void libafl_exit_request_breakpoint(CPUState* cpu, target_ulong pc)
125125
prepare_qemu_exit(cpu, pc);
126126
}
127127

128+
void libafl_exit_request_crash(CPUState* cpu)
129+
{
130+
CPUClass* cc = CPU_GET_CLASS(cpu);
131+
132+
expected_exit = true;
133+
last_exit_reason.kind = CRASH;
134+
last_exit_reason.cpu = cpu;
135+
136+
prepare_qemu_exit(current_cpu, cc->get_pc(cpu));
137+
}
138+
128139
#ifndef CONFIG_USER_ONLY
129140
void libafl_exit_request_timeout(void)
130141
{

libafl/user.c

+14-2
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44

55
#include "libafl/user.h"
66

7+
extern abi_ulong target_brk, initial_target_brk;
8+
79
static struct image_info libafl_image_info;
810

9-
struct libafl_qemu_sig_ctx libafl_qemu_sig_ctx = {0};
11+
static struct libafl_qemu_sig_ctx libafl_qemu_sig_ctx = {0};
1012

11-
extern abi_ulong target_brk, initial_target_brk;
13+
// if true, target crashes will issue an exit request and return to harness.
14+
// if false, target crahes will raise the appropriate signal.
15+
static bool libafl_return_on_crash = false;
1216

1317
void host_signal_handler(int host_sig, siginfo_t* info, void* puc);
1418

@@ -54,6 +58,14 @@ uint64_t libafl_set_brk(uint64_t new_brk)
5458
return old_brk;
5559
}
5660

61+
void libafl_set_return_on_crash(bool return_on_crash) {
62+
libafl_return_on_crash = return_on_crash;
63+
}
64+
65+
bool libafl_get_return_on_crash(void) {
66+
return libafl_return_on_crash;
67+
}
68+
5769
#ifdef AS_LIB
5870
void libafl_qemu_init(int argc, char** argv)
5971
{

linux-user/signal.c

+9-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
//// --- Begin LibAFL code ---
3939

4040
#include "libafl/user.h"
41+
#include "libafl/exit.h"
4142

4243
//// --- End LibAFL code ---
4344

@@ -1284,7 +1285,14 @@ static void handle_pending_signal(CPUArchState *cpu_env, int sig,
12841285
sig != TARGET_SIGURG &&
12851286
sig != TARGET_SIGWINCH &&
12861287
sig != TARGET_SIGCONT) {
1287-
dump_core_and_abort(cpu_env, sig);
1288+
//// --- Start LibAFL code ---
1289+
if (libafl_get_return_on_crash()) {
1290+
libafl_exit_request_crash(env_cpu(cpu_env));
1291+
} else {
1292+
dump_core_and_abort(cpu_env, sig);
1293+
}
1294+
//// --- End LibAFL code ---
1295+
// dump_core_and_abort(cpu_env, sig);
12881296
}
12891297
} else if (handler == TARGET_SIG_IGN) {
12901298
/* ignore sig */

0 commit comments

Comments
 (0)