mirror of
https://github.com/radareorg/radare2.git
synced 2024-12-13 07:57:35 +00:00
Fix r2 -d
problem not loading syms. Redo the ASLR/PIE again
This commit is contained in:
parent
1d390d4767
commit
0e0dc63aa8
@ -66,6 +66,28 @@ static int verify_version(int show) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// we should probably move this functionality into the r_debug API
|
||||
// r_debug_get_baddr
|
||||
static ut64 getBaddrFromDebugger(RCore *r, const char *file) {
|
||||
RListIter *iter;
|
||||
RDebugMap *map;
|
||||
r_debug_attach (r->dbg, r->io->desc->fd);
|
||||
r_debug_map_sync (r->dbg);
|
||||
r_list_foreach (r->dbg->maps, iter, map) {
|
||||
if (!strcmp (file, map->name)) {
|
||||
return map->addr;
|
||||
}
|
||||
}
|
||||
// fallback resolution (osx/w32?)
|
||||
// we asume maps to be loaded in order, so lower addresses come first
|
||||
r_list_foreach (r->dbg->maps, iter, map) {
|
||||
if (map->perm == 5) { // r-x
|
||||
return map->addr;
|
||||
}
|
||||
}
|
||||
return 0LL;
|
||||
}
|
||||
|
||||
static int main_help(int line) {
|
||||
if (line<2)
|
||||
printf ("Usage: r2 [-dDwntLqv] [-P patch] [-p prj] [-a arch] [-b bits] [-i file]\n"
|
||||
@ -442,14 +464,24 @@ int main(int argc, char **argv, char **envp) {
|
||||
if (optind<argc)
|
||||
file = r_str_concat (file, " ");
|
||||
}
|
||||
if (!r_core_bin_load (&r, file, baddr)) {
|
||||
RBinObject *obj = r_bin_get_object (r.bin);
|
||||
if (obj && obj->info)
|
||||
eprintf ("bits %d\n", obj->info->bits);
|
||||
{
|
||||
char *diskfile = strstr (file, "://");
|
||||
if (diskfile) {
|
||||
diskfile += 3;
|
||||
} else diskfile = file;
|
||||
fh = r_core_file_open (&r, file, perms, mapaddr);
|
||||
if (fh != NULL)
|
||||
r_debug_use (r.dbg, is_gdb? "gdb": debugbackend);
|
||||
/* load symbols when doing r2 -d ls */
|
||||
// NOTE: the baddr is redefined to support PIE/ASLR
|
||||
baddr = getBaddrFromDebugger (&r, diskfile);
|
||||
if (baddr) eprintf ("Using BADDR %llx\n", baddr);
|
||||
if (r_core_bin_load (&r, diskfile, baddr)) {
|
||||
RBinObject *obj = r_bin_get_object (r.bin);
|
||||
if (obj && obj->info)
|
||||
eprintf ("bits %d\n", obj->info->bits);
|
||||
}
|
||||
}
|
||||
fh = r_core_file_open (&r, file, perms, mapaddr);
|
||||
if (fh != NULL)
|
||||
r_debug_use (r.dbg, is_gdb? "gdb": debugbackend);
|
||||
}
|
||||
}
|
||||
|
||||
@ -480,6 +512,8 @@ int main(int argc, char **argv, char **envp) {
|
||||
if (r.file && r.file->desc && r.file->desc->name)
|
||||
filepath = r.file->desc->name;
|
||||
|
||||
/* Load rbin info from r2 dbg:// or r2 /bin/ls */
|
||||
/* the baddr should be set manually here */
|
||||
if (!r_core_bin_load (&r, filepath, baddr))
|
||||
r_config_set (r.config, "io.va", "false");
|
||||
}
|
||||
|
@ -46,9 +46,11 @@ static int ppc_op(RAnal *anal, RAnalOp *op, ut64 addr, const ut8 *_bytes, int le
|
||||
op->jump = (aa)?(baddr):(addr+baddr+4);
|
||||
op->eob = 1;
|
||||
break;
|
||||
#if 0
|
||||
case 7: // sc/svc
|
||||
op->type = R_ANAL_OP_TYPE_SWI;
|
||||
break;
|
||||
#endif
|
||||
#if 0
|
||||
case 15: // bl
|
||||
// OK
|
||||
|
@ -491,7 +491,8 @@ R_API int r_bin_load_io_at_offset_as_sz(RBin *bin, RIODesc *desc, ut64 baseaddr,
|
||||
// if there is no fixed size or its MAXED, there is no way to definitively
|
||||
// load the bin-properly. Many of the plugins require all content and are not
|
||||
// stream based loaders
|
||||
RIODesc *tdesc = iob->desc_open (io, desc->name, desc->flags, R_IO_READ);
|
||||
// NOTE: For RBin we dont need to open the file in read-write. This can be problematic
|
||||
RIODesc *tdesc = iob->desc_open (io, desc->name, R_IO_READ, 0); //desc->flags, R_IO_READ);
|
||||
if (!tdesc) return R_FALSE;
|
||||
file_sz = iob->desc_size (io, tdesc);
|
||||
if (file_sz == UT64_MAX) {
|
||||
|
@ -422,7 +422,8 @@ static int cmd_debug_map(RCore *core, const char *input) {
|
||||
}
|
||||
r_debug_map_sync (core->dbg); // update process memory maps
|
||||
r_list_foreach (core->dbg->maps, iter, map) {
|
||||
if ((addr != -1 && (addr >= map->addr && addr < map->addr_end)) ||
|
||||
if (core && core->bin && core->bin->cur && core->bin->cur->o && \
|
||||
(addr != -1 && (addr >= map->addr && addr < map->addr_end)) ||
|
||||
(libname != NULL && (strstr (map->name, libname)))) {
|
||||
RBinObject *o = core->bin->cur->o;
|
||||
filter.offset = 0LL;
|
||||
|
@ -127,7 +127,7 @@ static inline RIODesc *__getioplugin(RIO *io, const char *_uri, int flags, int m
|
||||
}
|
||||
if (!desc) {
|
||||
plugin = r_io_plugin_get_default (io, uri, 0);
|
||||
desc = plugin ? plugin->open (io, uri, flags, mode) : NULL;
|
||||
desc = (plugin&&plugin->open) ? plugin->open (io, uri, flags, mode) : NULL;
|
||||
if (desc) {
|
||||
r_io_desc_add (io, desc);
|
||||
if (desc->fd != -1)
|
||||
@ -197,7 +197,7 @@ R_API RIODesc *r_io_open_nomap(RIO *io, const char *file, int flags, int mode) {
|
||||
r_io_desc_add (io, desc);
|
||||
if (io->autofd || !io->desc)
|
||||
r_io_use_desc (io, desc);
|
||||
} else eprintf ("r_io_open_nomap: Unable to open file: %s\n", file);
|
||||
} else eprintf ("r_io_open_nomap: Unable to open file: %s\n", file);
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
@ -244,9 +244,14 @@ static int __plugin_open_default(RIO *io, const char *file, ut8 many) {
|
||||
return r_io_def_mmap_check_default (file);
|
||||
}
|
||||
|
||||
// default open should permit opening
|
||||
static RIODesc *__open_default(RIO *io, const char *file, int flags, int mode) {
|
||||
RIODesc *iod;
|
||||
if (!r_io_def_mmap_check_default (file) ) return NULL;
|
||||
return r_io_def_mmap_open (io, file, flags, mode);
|
||||
iod = r_io_def_mmap_open (io, file, flags, mode);
|
||||
return iod;
|
||||
// NTOE: uncomment this line to support loading files in ro as fallback is rw fails
|
||||
// return iod? iod: r_io_def_mmap_open (io, file, R_IO_READ, mode);
|
||||
}
|
||||
|
||||
static int __read(RIO *io, RIODesc *fd, ut8 *buf, int len) {
|
||||
|
Loading…
Reference in New Issue
Block a user