diff --git a/.debugusrc1.js b/.debugusrc1.js index 90e6e68..3cc9ffe 100644 --- a/.debugusrc1.js +++ b/.debugusrc1.js @@ -11,6 +11,7 @@ print_pid(); print_program_load_offset(); mk_brk_addr(main_offset); list_brks(); + log_inf("1 --------------------------------------------"); dump_regs(); var r14 = get_reg("r14"); @@ -20,4 +21,12 @@ dump_regs(); set_reg("r14", r14); log_inf("3 --------------------------------------------"); dump_regs(); + +var r14_mem = mem_read(get_reg("r14")); +log_inf("Memory at r14 " + r14_mem); +mem_write(get_reg("r14"), "0x696969"); +log_inf("Memory at r14 " + mem_read(get_reg("r14"))); +mem_write(get_reg("r14"), r14_mem); +log_inf("Memory at r14 " + mem_read(get_reg("r14"))); + cont(); diff --git a/debugus.c b/debugus.c index 8b35a9e..d00cd8f 100644 --- a/debugus.c +++ b/debugus.c @@ -26,6 +26,8 @@ #define INIT_SCRIPT ".debugusrc.js" +// Registers + typedef enum { rax, rbx, @@ -139,6 +141,18 @@ Register get_reg_from_name(const char *name) } } +// Memory + +uint64_t mem_read(pid_t pid, uint64_t addr) +{ + return ptrace(PTRACE_PEEKDATA, pid, addr, NULL); +} + +void mem_write(pid_t pid, uint64_t addr, uint64_t v) +{ + ptrace(PTRACE_POKEDATA, pid, addr, v); +} + // How breakpoints work? // We can enable/disable breakpoints by putting/removing an int 3 instruction // into/from the executed program. int 3 will trigger a SIGTRAP, which we can @@ -316,6 +330,31 @@ void dbg_js_set_reg(js_State *js) js_pushundefined(js); } +void dbg_js_mem_read(js_State *js) +{ + Dbg *dbg = getdbg(); + const char *addr_str = js_tostring(js, 1); + uintptr_t addr; + sscanf(addr_str, "0x%"SCNxPTR, &addr); + uint64_t v = mem_read(dbg->pid, addr); + char buf[20]; + snprintf(buf, sizeof(buf), "0x%"PRIx64, v); + js_pushstring(js, buf); +} + +void dbg_js_mem_write(js_State *js) +{ + Dbg *dbg = getdbg(); + const char *addr_str = js_tostring(js, 1); + uintptr_t addr; + sscanf(addr_str, "0x%"SCNxPTR, &addr); + const char *value_str = js_tostring(js, 2); + uint64_t value; + sscanf(value_str, "0x%"SCNx64, &value); + mem_write(dbg->pid, addr, value); + js_pushundefined(js); +} + void dbg_init_js(Dbg *dbg) { dbg->js = js_newstate(NULL, NULL, JS_STRICT); @@ -339,6 +378,8 @@ void dbg_init_js(Dbg *dbg) make_js_func(get_program_load_offset, 0); make_js_func(get_reg, 1 /*reg name*/); make_js_func(set_reg, 2 /* reg name, value*/); + make_js_func(mem_read, 1 /*addr*/); + make_js_func(mem_write, 2 /*addr, value*/); #undef make_js_func }