Print function name and file location when caught a SIGSEGV
This commit is contained in:
@@ -6,27 +6,27 @@ ler("Test error message");
|
|||||||
var offset = "0x0000000000001169"; // dupa(), objdump -d ./test
|
var offset = "0x0000000000001169"; // dupa(), objdump -d ./test
|
||||||
|
|
||||||
// Testing...
|
// Testing...
|
||||||
pf();
|
// pf();
|
||||||
ppid();
|
// ppid();
|
||||||
pplo();
|
// pplo();
|
||||||
baddr(offset);
|
baddr(offset);
|
||||||
lsbrk();
|
lsbrk();
|
||||||
|
|
||||||
lif("1 --------------------------------------------");
|
// lif("1 --------------------------------------------");
|
||||||
dr();
|
// dr();
|
||||||
var r14 = gr("r14");
|
// var r14 = gr("r14");
|
||||||
sr("r14", "0x0");
|
// sr("r14", "0x0");
|
||||||
lif("2 --------------------------------------------");
|
// lif("2 --------------------------------------------");
|
||||||
dr();
|
// dr();
|
||||||
sr("r14", r14);
|
// sr("r14", r14);
|
||||||
lif("3 --------------------------------------------");
|
// lif("3 --------------------------------------------");
|
||||||
dr();
|
// dr();
|
||||||
|
|
||||||
var r14_mem = mrdr("r14");
|
// var r14_mem = mrdr("r14");
|
||||||
lif("Memory at r14 " + r14_mem);
|
// lif("Memory at r14 " + r14_mem);
|
||||||
mwrr("r14", "0x696969");
|
// mwrr("r14", "0x696969");
|
||||||
lif("Memory at r14 " + mrdr("r14"));
|
// lif("Memory at r14 " + mrdr("r14"));
|
||||||
mwrr("r14", r14_mem);
|
// mwrr("r14", r14_mem);
|
||||||
lif("Memory at r14 " + mrdr("r14"));
|
// lif("Memory at r14 " + mrdr("r14"));
|
||||||
|
|
||||||
// cont();
|
// cont();
|
||||||
|
|||||||
@@ -6,27 +6,27 @@ ler("Test error message");
|
|||||||
var offset = "@DUPA_ADDR"; // dupa(), objdump -d ./test
|
var offset = "@DUPA_ADDR"; // dupa(), objdump -d ./test
|
||||||
|
|
||||||
// Testing...
|
// Testing...
|
||||||
pf();
|
// pf();
|
||||||
ppid();
|
// ppid();
|
||||||
pplo();
|
// pplo();
|
||||||
baddr(offset);
|
baddr(offset);
|
||||||
lsbrk();
|
lsbrk();
|
||||||
|
|
||||||
lif("1 --------------------------------------------");
|
// lif("1 --------------------------------------------");
|
||||||
dr();
|
// dr();
|
||||||
var r14 = gr("r14");
|
// var r14 = gr("r14");
|
||||||
sr("r14", "0x0");
|
// sr("r14", "0x0");
|
||||||
lif("2 --------------------------------------------");
|
// lif("2 --------------------------------------------");
|
||||||
dr();
|
// dr();
|
||||||
sr("r14", r14);
|
// sr("r14", r14);
|
||||||
lif("3 --------------------------------------------");
|
// lif("3 --------------------------------------------");
|
||||||
dr();
|
// dr();
|
||||||
|
|
||||||
var r14_mem = mrdr("r14");
|
// var r14_mem = mrdr("r14");
|
||||||
lif("Memory at r14 " + r14_mem);
|
// lif("Memory at r14 " + r14_mem);
|
||||||
mwrr("r14", "0x696969");
|
// mwrr("r14", "0x696969");
|
||||||
lif("Memory at r14 " + mrdr("r14"));
|
// lif("Memory at r14 " + mrdr("r14"));
|
||||||
mwrr("r14", r14_mem);
|
// mwrr("r14", r14_mem);
|
||||||
lif("Memory at r14 " + mrdr("r14"));
|
// lif("Memory at r14 " + mrdr("r14"));
|
||||||
|
|
||||||
// cont();
|
// cont();
|
||||||
|
|||||||
4
da.h
4
da.h
@@ -7,11 +7,11 @@
|
|||||||
do { \
|
do { \
|
||||||
if ((da)->count == 0) { \
|
if ((da)->count == 0) { \
|
||||||
(da)->capacity = 1; \
|
(da)->capacity = 1; \
|
||||||
(da)->items = malloc(sizeof(item)*sizeof((da)->capacity)); \
|
(da)->items = (typeof((da)->items))malloc(sizeof(item)*sizeof((da)->capacity)); \
|
||||||
} else { \
|
} else { \
|
||||||
if ((da)->count == (da)->capacity) { \
|
if ((da)->count == (da)->capacity) { \
|
||||||
(da)->capacity *= 2; \
|
(da)->capacity *= 2; \
|
||||||
(da)->items = realloc((da)->items, (da)->capacity * sizeof((item))); \
|
(da)->items = (typeof((da)->items))realloc((da)->items, (da)->capacity * sizeof((item))); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
(da)->items[(da)->count++] = (item); \
|
(da)->items[(da)->count++] = (item); \
|
||||||
|
|||||||
51
debugus.c
51
debugus.c
@@ -145,6 +145,14 @@ void brk_disable(Brk *brk)
|
|||||||
brk->enabled = false;
|
brk->enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void symbols_deinit(Symbols *s)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < s->count; i++) {
|
||||||
|
free((char *)s->items[i].name);
|
||||||
|
}
|
||||||
|
da_deinit(s);
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *file;
|
const char *file;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
@@ -152,6 +160,8 @@ typedef struct {
|
|||||||
HashTable brks;
|
HashTable brks;
|
||||||
uintptr_t program_load_offset;
|
uintptr_t program_load_offset;
|
||||||
HashTable js_descs;
|
HashTable js_descs;
|
||||||
|
Symbols symbols;
|
||||||
|
FILE *binfile;
|
||||||
PLibelfinBinding plibelfin;
|
PLibelfinBinding plibelfin;
|
||||||
} Dbg;
|
} Dbg;
|
||||||
|
|
||||||
@@ -165,7 +175,26 @@ siginfo_t dbg_get_siginfo(Dbg *dbg)
|
|||||||
void dbg_handle_sigsegv(Dbg *dbg, siginfo_t info)
|
void dbg_handle_sigsegv(Dbg *dbg, siginfo_t info)
|
||||||
{
|
{
|
||||||
unused(dbg);
|
unused(dbg);
|
||||||
|
uint64_t dbg_get_rip(Dbg *dbg);
|
||||||
LOG_ERR("Caught a segfault %d. SKILL ISSUE BRO\n", info.si_code);
|
LOG_ERR("Caught a segfault %d. SKILL ISSUE BRO\n", info.si_code);
|
||||||
|
uintptr_t rip = (uintptr_t)dbg_get_rip(dbg);
|
||||||
|
uintptr_t nearest = rip - dbg->symbols.items[0].addr;
|
||||||
|
for (int i = 0; i < dbg->symbols.count; i++) {
|
||||||
|
if (rip - dbg->symbols.items[i].addr < nearest) {
|
||||||
|
nearest = rip - dbg->symbols.items[i].addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uintptr_t addr = rip - nearest;
|
||||||
|
for (int i = 0; i < dbg->symbols.count; i++) {
|
||||||
|
if (dbg->symbols.items[i].addr == addr) {
|
||||||
|
AddrInfo *ai = libelfin_wrap_info_from_rip(dbg->plibelfin, (uint64_t)(addr - dbg->program_load_offset));
|
||||||
|
if (ai != NULL) {
|
||||||
|
LOG_INF("%s:%zu in function %s()\n", ai->file, (size_t)ai->line, dbg->symbols.items[i].name);
|
||||||
|
libelfin_wrap_free_info(ai);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dbg_handle_sigtrap(Dbg *dbg, siginfo_t info)
|
void dbg_handle_sigtrap(Dbg *dbg, siginfo_t info)
|
||||||
@@ -538,17 +567,29 @@ void dbg_load_script(Dbg *dbg, const char *script_path)
|
|||||||
fclose(script);
|
fclose(script);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dbg_libelfin_wrap_init(Dbg *dbg)
|
void dbg_init_bin(Dbg *dbg)
|
||||||
{
|
{
|
||||||
FILE *bin = fopen(dbg->file, "rb");
|
FILE *bin = fopen(dbg->file, "rb");
|
||||||
if (bin == NULL) {
|
if (bin == NULL) {
|
||||||
LOG_ERR("could not open file %s: %s\n", dbg->file, strerror(errno));
|
LOG_ERR("could not open file %s: %s\n", dbg->file, strerror(errno));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
dbg->binfile = bin;
|
||||||
|
}
|
||||||
|
|
||||||
dbg->plibelfin = libelfin_wrap_get_binding(fileno(bin));
|
void dbg_libelfin_wrap_init(Dbg *dbg)
|
||||||
|
{
|
||||||
|
dbg->plibelfin = libelfin_wrap_get_binding(fileno(dbg->binfile), dbg->program_load_offset);
|
||||||
|
}
|
||||||
|
|
||||||
fclose(bin);
|
void dbg_load_symbols(Dbg *dbg)
|
||||||
|
{
|
||||||
|
libelfin_wrap_get_syms(dbg->plibelfin, &dbg->symbols);
|
||||||
|
|
||||||
|
for (int i = 0; i < dbg->symbols.count; i++) {
|
||||||
|
Symbol *s = &dbg->symbols.items[i];
|
||||||
|
LOG_INF("Found symbol %s 0x%"PRIxPTR"\n", s->name, s->addr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dbg_init(Dbg *dbg, const char *file, pid_t pid)
|
void dbg_init(Dbg *dbg, const char *file, pid_t pid)
|
||||||
@@ -559,7 +600,9 @@ void dbg_init(Dbg *dbg, const char *file, pid_t pid)
|
|||||||
hashtable_init(&dbg->js_descs, MAX_JS_FUNCS);
|
hashtable_init(&dbg->js_descs, MAX_JS_FUNCS);
|
||||||
dbg_init_js(dbg);
|
dbg_init_js(dbg);
|
||||||
dbg_init_load_offset(dbg);
|
dbg_init_load_offset(dbg);
|
||||||
|
dbg_init_bin(dbg);
|
||||||
dbg_libelfin_wrap_init(dbg);
|
dbg_libelfin_wrap_init(dbg);
|
||||||
|
dbg_load_symbols(dbg);
|
||||||
hashtable_init(&dbg->brks, MAX_BRKS);
|
hashtable_init(&dbg->brks, MAX_BRKS);
|
||||||
dbg_load_script(dbg, INIT_SCRIPT);
|
dbg_load_script(dbg, INIT_SCRIPT);
|
||||||
}
|
}
|
||||||
@@ -569,7 +612,9 @@ void dbg_deinit(Dbg *dbg)
|
|||||||
js_freestate(dbg->js);
|
js_freestate(dbg->js);
|
||||||
hashtable_deinit(&dbg->brks);
|
hashtable_deinit(&dbg->brks);
|
||||||
hashtable_deinit(&dbg->js_descs);
|
hashtable_deinit(&dbg->js_descs);
|
||||||
|
symbols_deinit(&dbg->symbols);
|
||||||
libelfin_wrap_free_binding(dbg->plibelfin);
|
libelfin_wrap_free_binding(dbg->plibelfin);
|
||||||
|
fclose(dbg->binfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dbg_loop(Dbg *dbg)
|
void dbg_loop(Dbg *dbg)
|
||||||
|
|||||||
@@ -7,19 +7,41 @@
|
|||||||
class LibelfinBinding
|
class LibelfinBinding
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LibelfinBinding(int fd)
|
LibelfinBinding(int fd, uintptr_t _loadoffset)
|
||||||
: elf(elf::create_mmap_loader(fd)),
|
: elf(elf::create_mmap_loader(fd)),
|
||||||
dwarf(dwarf::elf::create_loader(this->elf))
|
dwarf(dwarf::elf::create_loader(this->elf)),
|
||||||
|
loadoffset(_loadoffset)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
elf::elf elf;
|
elf::elf elf;
|
||||||
dwarf::dwarf dwarf;
|
dwarf::dwarf dwarf;
|
||||||
|
uintptr_t loadoffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
DEBUGUS_EXTERNC PLibelfinBinding libelfin_wrap_get_binding(int fd)
|
DEBUGUS_EXTERNC void libelfin_wrap_get_syms(PLibelfinBinding *pbind, Symbols *syms)
|
||||||
{
|
{
|
||||||
return (PLibelfinBinding)new LibelfinBinding(fd);
|
LibelfinBinding *bind = (LibelfinBinding *)pbind;
|
||||||
|
for (auto §ion : bind->elf.sections()) {
|
||||||
|
if (section.get_hdr().type == elf::sht::symtab) {
|
||||||
|
for (auto sym : section.as_symtab()) {
|
||||||
|
auto &d = sym.get_data();
|
||||||
|
if (d.type() == elf::stt::func) {
|
||||||
|
Symbol s = {
|
||||||
|
.name = (const char *)malloc(strlen(sym.get_name().c_str())+1),
|
||||||
|
.addr = bind->loadoffset + (uintptr_t)d.value,
|
||||||
|
};
|
||||||
|
strcpy((char*)s.name, sym.get_name().c_str());
|
||||||
|
da_append(syms, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUGUS_EXTERNC PLibelfinBinding libelfin_wrap_get_binding(int fd, uintptr_t loadoffset)
|
||||||
|
{
|
||||||
|
return (PLibelfinBinding)new LibelfinBinding(fd, loadoffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUGUS_EXTERNC void libelfin_wrap_free_binding(PLibelfinBinding pbind)
|
DEBUGUS_EXTERNC void libelfin_wrap_free_binding(PLibelfinBinding pbind)
|
||||||
|
|||||||
@@ -12,17 +12,30 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "da.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ssize_t line;
|
ssize_t line;
|
||||||
const char *file;
|
const char *file;
|
||||||
uint64_t addr;
|
uint64_t addr;
|
||||||
} AddrInfo;
|
} AddrInfo;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char *name;
|
||||||
|
uintptr_t addr;
|
||||||
|
} Symbol;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Symbol *items;
|
||||||
|
size_t count, capacity;
|
||||||
|
} Symbols;
|
||||||
|
|
||||||
typedef void * PLibelfinBinding;
|
typedef void * PLibelfinBinding;
|
||||||
|
|
||||||
DEBUGUS_EXTERNC PLibelfinBinding libelfin_wrap_get_binding(int fd);
|
DEBUGUS_EXTERNC PLibelfinBinding libelfin_wrap_get_binding(int fd, uintptr_t loadoffset);
|
||||||
DEBUGUS_EXTERNC void libelfin_wrap_free_binding(PLibelfinBinding pbind);
|
DEBUGUS_EXTERNC void libelfin_wrap_free_binding(PLibelfinBinding pbind);
|
||||||
DEBUGUS_EXTERNC AddrInfo *libelfin_wrap_info_from_rip(PLibelfinBinding pbind, uint64_t rip);
|
DEBUGUS_EXTERNC AddrInfo *libelfin_wrap_info_from_rip(PLibelfinBinding pbind, uint64_t rip);
|
||||||
DEBUGUS_EXTERNC void libelfin_wrap_free_info(AddrInfo *ai);
|
DEBUGUS_EXTERNC void libelfin_wrap_free_info(AddrInfo *ai);
|
||||||
|
DEBUGUS_EXTERNC void libelfin_wrap_get_syms(PLibelfinBinding *pbind, Symbols *syms);
|
||||||
|
|
||||||
#endif // LIBELFIN_WRAP_H_
|
#endif // LIBELFIN_WRAP_H_
|
||||||
|
|||||||
5
test.c
5
test.c
@@ -1,5 +1,6 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
void dupa(void) {
|
void dupa(void) {
|
||||||
printf("KSKSKKSKSKSK\n");
|
printf("KSKSKKSKSKSK\n");
|
||||||
@@ -15,6 +16,10 @@ int main(void)
|
|||||||
dupa();
|
dupa();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int *a = NULL;
|
||||||
|
*a = 6969;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user