/* Debugger stack display with symbols */ int cmd_dbgstack() { char *param; eresi_Addr size; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); /* Preliminary checks */ if (!elfsh_is_runtime_mode()) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Command only available in e2dbg", (-1)); param = world.curjob->curcmd->param[0]; if (!param) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid argument", (-1)); param = revm_lookup_string(param); /* Dump debugger stack */ if (revm_isnbr(param)) { if (sscanf(param, UFMT, &size) != 1) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid argument", (-1)); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, e2dbg_stack_dump(size, (eresi_Addr) ¶m)); } PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid parameter", -1); }
/* Find a breakpoint by various ways */ elfshbp_t *e2dbg_breakpoint_lookup(char *name) { eresi_Addr addr; elfshbp_t *bp; uint16_t bpid; char straddr[32]; char logbuf[BUFSIZ]; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); bp = NULL; /* Lookup by vaddr */ if (IS_VADDR(name)) { if (sscanf(name + 2, AFMT, &addr) != 1) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid virtual address requested", NULL); } /* Try to lookup by ID */ else if (revm_isnbr(name)) { bpid = atoi(name); bp = e2dbg_breakpoint_from_id(bpid); if (!bp) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid breakpoint ID", NULL); } /* Resolve symbol */ /* Here we fix symbols on the disk only ! This avoid a mprotect */ else { addr = e2dbg_breakpoint_find_addr(name); if (!addr) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Requested symbol address unknown", NULL); } /* Get the breakpoint */ if (!bp) { snprintf(straddr, sizeof(straddr), XFMT, addr); bp = hash_get(&e2dbgworld.bp, straddr); if (!bp) { snprintf(logbuf, BUFSIZ, "\n [!] No breakpoint set at addr " AFMT " \n\n", addr); e2dbg_output(logbuf); PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "No breakpoint at this address", NULL); } } PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, bp); }
/* Stack display with symbols */ int cmd_stack() { char *param; eresi_Addr size; revmobj_t *ssp; revmexpr_t *expr; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); /* Preliminary checks */ if (!elfsh_is_runtime_mode()) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Command only available in e2dbg", (-1)); param = world.curjob->curcmd->param[0]; if (!param) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid argument", (-1)); param = revm_lookup_string(param); expr = revm_expr_get(E2DBG_SSP_VAR); if (!expr || !expr->value) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "No saved SP", -1); ssp = expr->value; /* Dump debuggee stack */ if (revm_isnbr(param)) { if (sscanf(param, UFMT, &size) != 1) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid argument", (-1)); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, e2dbg_stack_dump(size, ssp->immed_val.ent)); } PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Invalid parameter", -1); }