aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYour Name <you@example.com>2022-10-11 18:15:51 +0100
committerYour Name <you@example.com>2022-10-11 18:15:51 +0100
commit7461c52278ff3a96ebc4d71d369d3a8b24fd19b1 (patch)
tree8b475c0772ec6603341aadc31e458d55cc601fbf
parentfac6491ad0bbaee078352990eeb708d82aa412e3 (diff)
downloadafl++-7461c52278ff3a96ebc4d71d369d3a8b24fd19b1.tar.gz
Fixes for x64
-rw-r--r--frida_mode/GNUmakefile56
-rw-r--r--frida_mode/hook/frida_hook.c2
-rw-r--r--frida_mode/src/instrument/instrument_arm32.c28
-rw-r--r--frida_mode/src/instrument/instrument_arm64.c34
-rw-r--r--frida_mode/src/instrument/instrument_x64.c39
-rw-r--r--frida_mode/src/instrument/instrument_x86.c39
-rw-r--r--frida_mode/src/js/js.c2
7 files changed, 138 insertions, 62 deletions
diff --git a/frida_mode/GNUmakefile b/frida_mode/GNUmakefile
index 5cd01ffd..79367671 100644
--- a/frida_mode/GNUmakefile
+++ b/frida_mode/GNUmakefile
@@ -58,7 +58,9 @@ CFLAGS+=-Werror \
-Wall \
-Wextra \
-Wpointer-arith \
- -Wno-unknown-pragmas
+ -Wno-unknown-pragmas \
+ -Wno-pointer-to-int-cast \
+ -Wno-int-to-pointer-cast
else
CFLAGS+=-Wno-pointer-arith
endif
@@ -207,7 +209,7 @@ $(FRIDA_MAKEFILE): | $(BUILD_DIR)
.PHONY: $(GUM_DEVIT_LIBRARY)
$(GUM_DEVIT_LIBRARY): $(FRIDA_MAKEFILE)
- cd $(FRIDA_DIR) && make gum-$(OS)$(GUM_ARCH)
+ cd $(FRIDA_DIR) && make gum-$(OS)$(GUM_ARCH) FRIDA_V8=disabled
$(GUM_DEVIT_HEADER): $(FRIDA_MAKEFILE) | $(FRIDA_BUILD_DIR)
echo "#include <stdio.h>" > $@
@@ -246,40 +248,40 @@ TRACE_LDFLAGS+=$(FRIDA_DIR)build/frida-$(OS)-$(ARCH)/lib/libfrida-gum-1.0.a \
else ifeq "$(ARCH)" "arm64"
-CFLAGS+=-I $(FRIDA_DIR)build/frida_thin-$(OS)-$(ARCH)/include/frida-1.0 \
- -I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/glib-2.0/ \
- -I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/glib-2.0/include/ \
- -I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/capstone/ \
- -I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/json-glib-1.0/ \
+CFLAGS+=-I $(FRIDA_DIR)build/$(OS)-$(ARCH)/include/frida-1.0 \
+ -I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/glib-2.0/ \
+ -I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/glib-2.0/include/ \
+ -I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/capstone/ \
+ -I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/json-glib-1.0/ \
ifeq "$(OS)" "android"
CFLAGS += -static-libstdc++
endif
else
-CFLAGS+=-I $(FRIDA_DIR)build/frida_thin-$(OS)-$(ARCH)/include/frida-1.0 \
- -I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/glib-2.0/ \
- -I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/glib-2.0/include/ \
- -I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/capstone/ \
- -I $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/include/json-glib-1.0/ \
+CFLAGS+=-I $(FRIDA_DIR)build/$(OS)-$(ARCH)/include/frida-1.0 \
+ -I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/glib-2.0/ \
+ -I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/glib-2.0/include/ \
+ -I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/capstone/ \
+ -I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/json-glib-1.0/ \
endif
TRACE_LDFLAGS+=$(FRIDA_DIR)build/frida-$(OS)-$(ARCH)/lib/libfrida-gum-1.0.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libsoup-2.4.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libsqlite3.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libtcc.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libjson-glib-1.0.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libquickjs.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libcapstone.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libunwind.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libffi.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libdwarf.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libelf.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libgio-2.0.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libgobject-2.0.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libglib-2.0.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/liblzma.a \
- $(FRIDA_DIR)build/frida_thin-sdk-$(OS)-$(ARCH)/lib/libz.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libsoup-2.4.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libsqlite3.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libtcc.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libjson-glib-1.0.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libquickjs.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libcapstone.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libunwind.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libffi.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libdwarf.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libelf.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libgio-2.0.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libgobject-2.0.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libglib-2.0.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/liblzma.a \
+ $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/lib/libz.a \
CFLAGS+=-I $(FRIDA_DIR)build/frida-$(OS)-$(ARCH)/include/frida-1.0 \
-I $(FRIDA_DIR)build/sdk-$(OS)-$(ARCH)/include/glib-2.0/ \
diff --git a/frida_mode/hook/frida_hook.c b/frida_mode/hook/frida_hook.c
index 79e2348d..da1a59b2 100644
--- a/frida_mode/hook/frida_hook.c
+++ b/frida_mode/hook/frida_hook.c
@@ -54,10 +54,12 @@ __attribute__((visibility("default"))) void afl_persistent_hook(
__attribute__((visibility("default"))) void afl_persistent_hook(
GumCpuContext *regs, uint8_t *input_buf, uint32_t input_buf_len) {
+
// do a length check matching the target!
memcpy((void *)regs->r[0], input_buf, input_buf_len);
regs->r[1] = input_buf_len;
+
}
#else
diff --git a/frida_mode/src/instrument/instrument_arm32.c b/frida_mode/src/instrument/instrument_arm32.c
index 44e37e11..cb2a322b 100644
--- a/frida_mode/src/instrument/instrument_arm32.c
+++ b/frida_mode/src/instrument/instrument_arm32.c
@@ -9,8 +9,8 @@
#define PAGE_MASK (~(GUM_ADDRESS(0xfff)))
#define PAGE_ALIGNED(x) ((GUM_ADDRESS(x) & PAGE_MASK) == GUM_ADDRESS(x))
-gboolean instrument_cache_enabled = FALSE;
-gsize instrument_cache_size = 0;
+gboolean instrument_cache_enabled = FALSE;
+gsize instrument_cache_size = 0;
static GHashTable *coverage_blocks = NULL;
extern __thread guint64 instrument_previous_pc;
@@ -42,7 +42,7 @@ typedef struct {
// ldr r1, [sp, #-132] ; 0xffffff7c
// ldr r0, [sp, #-128] ; 0xffffff80
- uint32_t b_code; /* b imm */
+ uint32_t b_code; /* b imm */
uint8_t *shared_mem;
uint64_t *prev_location;
@@ -136,43 +136,53 @@ gboolean instrument_is_coverage_optimize_supported(void) {
static void instrument_coverage_switch(GumStalkerObserver *self,
gpointer from_address,
- gpointer start_address,
- void *from_insn,
- gpointer *target) {
+ gpointer start_address, void *from_insn,
+ gpointer *target) {
+
UNUSED_PARAMETER(self);
UNUSED_PARAMETER(from_address);
UNUSED_PARAMETER(start_address);
UNUSED_PARAMETER(from_insn);
if (!g_hash_table_contains(coverage_blocks, GSIZE_TO_POINTER(*target))) {
+
return;
+
}
- *target = (guint8 *)*target + G_STRUCT_OFFSET(afl_log_code_asm_t, str_r0_sp_rz);
+ *target =
+ (guint8 *)*target + G_STRUCT_OFFSET(afl_log_code_asm_t, str_r0_sp_rz);
+
}
static void instrument_coverage_suppress_init(void) {
+
static gboolean initialized = false;
if (initialized) { return; }
initialized = true;
- GumStalkerObserver * observer = stalker_get_observer();
+ GumStalkerObserver *observer = stalker_get_observer();
GumStalkerObserverInterface *iface = GUM_STALKER_OBSERVER_GET_IFACE(observer);
iface->switch_callback = instrument_coverage_switch;
coverage_blocks = g_hash_table_new(g_direct_hash, g_direct_equal);
if (coverage_blocks == NULL) {
+
FATAL("Failed to g_hash_table_new, errno: %d", errno);
+
}
+
}
static void patch_t3_insn(uint32_t *insn, uint16_t val) {
+
uint32_t orig = GUINT32_FROM_LE(*insn);
uint32_t imm12 = (val & 0xfff);
uint32_t imm4 = (val >> 12);
orig |= imm12;
orig |= (imm4 << 16);
*insn = GUINT32_TO_LE(orig);
+
}
void instrument_coverage_optimize(const cs_insn *instr,
@@ -190,7 +200,9 @@ void instrument_coverage_optimize(const cs_insn *instr,
block_start = GSIZE_TO_POINTER(GUM_ADDRESS(cw->code));
if (!g_hash_table_add(coverage_blocks, block_start)) {
+
FATAL("Failed - g_hash_table_add");
+
}
code.code = template;
diff --git a/frida_mode/src/instrument/instrument_arm64.c b/frida_mode/src/instrument/instrument_arm64.c
index fe70a8bb..c7584a87 100644
--- a/frida_mode/src/instrument/instrument_arm64.c
+++ b/frida_mode/src/instrument/instrument_arm64.c
@@ -156,46 +156,46 @@ static gboolean instrument_is_deterministic(const cs_insn *from_insn) {
}
-cs_insn *
-instrument_disassemble (gconstpointer address)
-{
- csh capstone;
- cs_insn * insn = NULL;
+cs_insn *instrument_disassemble(gconstpointer address) {
- cs_open (CS_ARCH_ARM64, GUM_DEFAULT_CS_ENDIAN, &capstone);
- cs_option (capstone, CS_OPT_DETAIL, CS_OPT_ON);
+ csh capstone;
+ cs_insn *insn = NULL;
- cs_disasm (capstone, address, 16, GPOINTER_TO_SIZE (address), 1, &insn);
+ cs_open(CS_ARCH_ARM64, GUM_DEFAULT_CS_ENDIAN, &capstone);
+ cs_option(capstone, CS_OPT_DETAIL, CS_OPT_ON);
- cs_close (&capstone);
+ cs_disasm(capstone, address, 16, GPOINTER_TO_SIZE(address), 1, &insn);
+
+ cs_close(&capstone);
return insn;
+
}
static void instrument_coverage_switch(GumStalkerObserver *self,
gpointer from_address,
- gpointer start_address,
- void *from_insn,
- gpointer *target) {
+ gpointer start_address, void *from_insn,
+ gpointer *target) {
UNUSED_PARAMETER(self);
UNUSED_PARAMETER(from_address);
UNUSED_PARAMETER(start_address);
- cs_insn * insn = NULL;
+ cs_insn *insn = NULL;
gboolean deterministic = FALSE;
- gsize fixup_offset;
+ gsize fixup_offset;
if (!g_hash_table_contains(coverage_blocks, GSIZE_TO_POINTER(*target)) &&
- !g_hash_table_contains(coverage_blocks, GSIZE_TO_POINTER((guint8 *)*target + 4))) {
+ !g_hash_table_contains(coverage_blocks,
+ GSIZE_TO_POINTER((guint8 *)*target + 4))) {
return;
}
- insn = instrument_disassemble (from_insn);
+ insn = instrument_disassemble(from_insn);
deterministic = instrument_is_deterministic(insn);
- cs_free (insn, 1);
+ cs_free(insn, 1);
if (deterministic) { return; }
/*
diff --git a/frida_mode/src/instrument/instrument_x64.c b/frida_mode/src/instrument/instrument_x64.c
index 13ced4a3..f7b7d6c5 100644
--- a/frida_mode/src/instrument/instrument_x64.c
+++ b/frida_mode/src/instrument/instrument_x64.c
@@ -171,11 +171,11 @@ void instrument_coverage_optimize_init(void) {
}
-static void instrument_coverage_switch(GumStalkerObserver *self,
- gpointer from_address,
- gpointer start_address,
- const cs_insn *from_insn,
- gpointer *target) {
+static void instrument_coverage_switch_insn(GumStalkerObserver *self,
+ gpointer from_address,
+ gpointer start_address,
+ const cs_insn *from_insn,
+ gpointer *target) {
UNUSED_PARAMETER(self);
UNUSED_PARAMETER(from_address);
@@ -224,6 +224,35 @@ static void instrument_coverage_switch(GumStalkerObserver *self,
}
+cs_insn *instrument_disassemble(gconstpointer address) {
+
+ csh capstone;
+ cs_insn *insn = NULL;
+
+ cs_open(CS_ARCH_X86, GUM_CPU_MODE, &capstone);
+ cs_option(capstone, CS_OPT_DETAIL, CS_OPT_ON);
+
+ cs_disasm(capstone, address, 16, GPOINTER_TO_SIZE(address), 1, &insn);
+
+ cs_close(&capstone);
+
+ return insn;
+
+}
+
+static void instrument_coverage_switch(GumStalkerObserver *self,
+ gpointer from_address,
+ gpointer start_address, void *from_insn,
+ gpointer *target) {
+
+ if (from_insn == NULL) { return; }
+ cs_insn *insn = instrument_disassemble(from_insn);
+ instrument_coverage_switch_insn(self, from_address, start_address, insn,
+ target);
+ cs_free(insn, 1);
+
+}
+
static void instrument_coverage_suppress_init(void) {
static gboolean initialized = false;
diff --git a/frida_mode/src/instrument/instrument_x86.c b/frida_mode/src/instrument/instrument_x86.c
index eabd5be4..f15893cb 100644
--- a/frida_mode/src/instrument/instrument_x86.c
+++ b/frida_mode/src/instrument/instrument_x86.c
@@ -83,11 +83,11 @@ gboolean instrument_is_coverage_optimize_supported(void) {
}
-static void instrument_coverage_switch(GumStalkerObserver *self,
- gpointer from_address,
- gpointer start_address,
- const cs_insn *from_insn,
- gpointer *target) {
+static void instrument_coverage_switch_insn(GumStalkerObserver *self,
+ gpointer from_address,
+ gpointer start_address,
+ const cs_insn *from_insn,
+ gpointer *target) {
UNUSED_PARAMETER(self);
UNUSED_PARAMETER(from_address);
@@ -130,6 +130,35 @@ static void instrument_coverage_switch(GumStalkerObserver *self,
}
+cs_insn *instrument_disassemble(gconstpointer address) {
+
+ csh capstone;
+ cs_insn *insn = NULL;
+
+ cs_open(CS_ARCH_X86, GUM_CPU_MODE, &capstone);
+ cs_option(capstone, CS_OPT_DETAIL, CS_OPT_ON);
+
+ cs_disasm(capstone, address, 16, GPOINTER_TO_SIZE(address), 1, &insn);
+
+ cs_close(&capstone);
+
+ return insn;
+
+}
+
+static void instrument_coverage_switch(GumStalkerObserver *self,
+ gpointer from_address,
+ gpointer start_address, void *from_insn,
+ gpointer *target) {
+
+ if (from_insn == NULL) { return; }
+ cs_insn *insn = instrument_disassemble(from_insn);
+ instrument_coverage_switch_insn(self, from_address, start_address, insn,
+ target);
+ cs_free(insn, 1);
+
+}
+
static void instrument_coverage_suppress_init(void) {
static gboolean initialized = false;
diff --git a/frida_mode/src/js/js.c b/frida_mode/src/js/js.c
index 52b88d96..25187694 100644
--- a/frida_mode/src/js/js.c
+++ b/frida_mode/src/js/js.c
@@ -19,9 +19,11 @@ static GMainContext *context;
static GMainLoop *main_loop;
static void js_msg(const gchar *message, GBytes *data, gpointer user_data) {
+
UNUSED_PARAMETER(data);
UNUSED_PARAMETER(user_data);
FOKF("%s", message);
+
}
void js_config(void) {