bool test_va_malloc_zero(void) { RIO *io; ut64 buf; bool ret; io = r_io_new (); io->va = false; r_io_open_at (io, "malloc://8", R_PERM_RW, 0644, 0x0); buf = 0xdeadbeefcafebabe; ret = r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert ("should be able to read", ret); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x00\x00\x00\x00\x00\x00\x00\x00", 8, "0 should be there initially"); r_io_free (io); io = r_io_new (); io->va = true; r_io_open_at (io, "malloc://8", R_PERM_RW, 0644, 0x0); buf = 0xdeadbeefcafebabe; ret = r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert ("should be able to read", ret); mu_test_status = MU_TEST_BROKEN; mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x00\x00\x00\x00\x00\x00\x00\x00", 8, "0 should be there initially"); r_io_free (io); mu_end; }
int main () { int ret; RIODesc *fd; char buf[1024]; struct r_io_t *io; io = r_io_new(); r_io_plugin_list(io); //fd = r_io_open(io, "/bin/ls", R_IO_READ, 0); fd = r_io_open(io, "dbg:///bin/ls", R_IO_READ, 0); r_io_set_fd(io, fd); //r_io_map_add(io, fd, R_IO_READ, 0, 0xf00000, 0xffff); r_io_map_add(io, fd->fd, R_IO_READ, 0x8048000, 0, 0xffff); memset(buf, 0, 1024); //ret = r_io_read_at(io, 0xf00000, buf, 1024); // ret = r_io_seek(io, 0x8048000, R_IO_SEEK_SET); // printf("seek = 0x%"PFMT64x"\n", ret); ret = r_io_read_at (io, 0, (ut8*)buf, 64); //ret = r_io_read_at(io, 0x8048000, buf, 64); printf("%d = %02x %02x %02x %02x\n", ret, buf[0], buf[1], buf[2], buf[3]); r_io_free(io); return 0; }
bool test_r_io_pcache (void) { RIO *io = r_io_new (); ut8 buf[8]; int fd = r_io_fd_open (io, "malloc://3", R_PERM_RW, 0); r_io_map_add (io, fd, R_PERM_RW, 0LL, 0LL, 1); //8 r_io_map_add (io, fd, R_PERM_RW, 1, 1, 1); //= r_io_map_add (io, fd, R_PERM_RW, 1, 2, 1); //= r_io_map_add (io, fd, R_PERM_RW, 1, 3, 1); //= r_io_map_add (io, fd, R_PERM_RW, 1, 4, 1); //= r_io_map_add (io, fd, R_PERM_RW, 1, 5, 1); //= r_io_map_add (io, fd, R_PERM_RW, 2, 6, 1); //D io->p_cache = 2; io->va = true; r_io_fd_write_at (io, fd, 0, (const ut8*)"8=D", 3); r_io_read_at (io, 0x0, buf, 8); mu_assert_streq ((const char *)buf, "", "pcache read happened, but it shouldn't"); io->p_cache = 1; r_io_read_at (io, 0x0, buf, 8); mu_assert_streq ((const char *)buf, "8=====D", "expected an ascii-pn from pcache"); r_io_fd_write_at (io, fd, 0, (const ut8*)"XXX", 3); r_io_read_at (io, 0x0, buf, 8); mu_assert_streq ((const char *)buf, "8=====D", "expected an ascii-pn from pcache"); io->p_cache = 0; r_io_read_at (io, 0x0, buf, 8); mu_assert_streq ((const char *)buf, "XXXXXXX", "expected censorship of the ascii-pn"); r_io_free (io); mu_end; }
bool test_r_io_priority2(void) { RIO *io = r_io_new(); ut32 map0; ut8 buf[2]; bool ret; io->va = true; RIODesc *desc0 = r_io_open_at (io, "malloc://1024", R_PERM_RW, 0644, 0x0); mu_assert_notnull (desc0, "first malloc should be opened"); map0 = r_io_map_get (io, 0)->id; ret = r_io_read_at (io, 0, (ut8 *)&buf, 2); mu_assert ("should be able to read", ret); mu_assert_memeq (buf, (ut8 *)"\x00\x00", 2, "0 should be there initially"); r_io_write_at (io, 0, (const ut8 *)"\x90\x90", 2); r_io_read_at (io, 0, buf, 2); mu_assert_memeq (buf, (ut8 *)"\x90\x90", 2, "0x90 was written"); RIODesc *desc1 = r_io_open_at (io, "malloc://1024", R_PERM_R, 0644, 0x0); mu_assert_notnull (desc1, "second malloc should be opened"); r_io_read_at (io, 0, buf, 2); mu_assert_memeq (buf, (ut8 *)"\x00\x00", 2, "0x00 from map1 should be on top"); r_io_map_priorize (io, map0); r_io_read_at (io, 0, buf, 2); mu_assert_memeq (buf, (ut8 *)"\x90\x90", 2, "0x90 from map0 should be on top after prioritize"); r_io_free (io); mu_end; }
bool test_r_io_desc_exchange (void) { RIO *io = r_io_new (); int fd = r_io_fd_open (io, "malloc://3", R_PERM_R, 0), fdx = r_io_fd_open (io, "malloc://6", R_PERM_R, 0); r_io_desc_exchange (io, fd, fdx); mu_assert ("Desc-exchange is broken", (r_io_fd_size (io, fd) == 6)); r_io_free (io); mu_end; }
bool test_r_io_mapsplit (void) { RIO *io = r_io_new (); io->va = true; r_io_open_at (io, "null://2", R_PERM_R, 0LL, UT64_MAX); mu_assert ("Found no map at UT64", r_io_map_get (io, UT64_MAX)); mu_assert ("Found no map at 0x0", r_io_map_get (io, 0x0)); r_io_free (io); mu_end; }
bool test_r_io_priority(void) { RIO *io = r_io_new(); ut32 map0, map1; ut64 buf; bool ret; io->va = true; r_io_open_at (io, "malloc://8", R_PERM_RW, 0644, 0x0); map0 = r_io_map_get (io, 0)->id; ret = r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert ("should be able to read", ret); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x00\x00\x00\x00\x00\x00\x00\x00", 8, "0 should be there initially"); buf = 0x9090909090909090; r_io_write_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x90\x90\x90\x90\x90\x90\x90\x90", 8, "0x90 should have been written"); r_io_open_at (io, "malloc://2", R_PERM_RW, 0644, 0x4); map1 = r_io_map_get (io, 4)->id; r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x90\x90\x90\x90\x00\x00\x90\x90", 8, "0x00 from map1 should overlap"); buf ^= UT64_MAX; r_io_write_at (io, 0, (ut8 *)&buf, 8); r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x6f\x6f\x6f\x6f\xff\xff\x6f\x6f", 8, "memory has been xored"); r_io_map_priorize (io, map0); r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x6f\x6f\x6f\x6f\x90\x90\x6f\x6f", 8, "map0 should have been prioritized"); r_io_map_remap (io, map1, 0x2); r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x6f\x6f\x6f\x6f\x90\x90\x6f\x6f", 8, "map1 should have been remapped"); r_io_map_priorize (io, map1); r_io_read_at (io, 0, (ut8 *)&buf, 8); mu_assert_memeq ((ut8 *)&buf, (ut8 *)"\x6f\x6f\xff\xff\x90\x90\x6f\x6f", 8, "map1 should have been prioritized"); r_io_free (io); mu_end; }
void emu_free(emu *e) { if (e->reg == e->anal->reg) e->reg = NULL; else r_reg_free(e->reg); r_io_free(e->io); r_bin_free(e->bin); r_lib_free(e->lib); r_list_free(e->plugins); r_asm_free(e->a); r_asm_op_free(e->op); r_anal_op_free(e->anop); r_anal_free(e->anal); if (e->vsections) { RListIter *iter; VSection *vs; r_list_foreach(e->vsections, iter, vs) virtual_section_rm_i(e, vs->id); } r_list_free(e->vsections); if (e->screen) sdb_free (e->screen); free(e); }
int main(int argc, char **argv) { int i, ret, c, rad = 0, bsize = 0, numblocks = 0, ule = 0, b64mode = 0; const char *algo = "sha256"; /* default hashing algorithm */ const char *seed = NULL; char *hashstr = NULL; int hashstr_len = 0; int hashstr_hex = 0; ut64 algobit; RHash *ctx; RIO *io; while ((c = getopt (argc, argv, "jdDrvea:i:S:s:x:b:nBhf:t:kLq")) != -1) { switch (c) { case 'q': quiet = 1; break; case 'i': iterations = atoi (optarg); if (iterations<0) { eprintf ("error: -i argument must be positive\n"); return 1; } break; case 'j': rad = 'j'; break; case 'S': seed = optarg; break; case 'n': numblocks = 1; break; case 'd': b64mode = 1; break; case 'D': b64mode = 2; break; case 'L': algolist (); return 0; case 'e': ule = 1; break; case 'r': rad = 1; break; case 'k': rad = 2; break; case 'a': algo = optarg; break; case 'B': incremental = 0; break; case 'b': bsize = (int)r_num_math (NULL, optarg); break; case 'f': from = r_num_math (NULL, optarg); break; case 't': to = 1+r_num_math (NULL, optarg); break; case 'v': return blob_version ("rahash2"); case 'h': return do_help (0); case 's': setHashString (optarg, 0); break; case 'x': setHashString (optarg, 1); break; break; default: eprintf ("rahash2: Unknown flag\n"); return 1; } } if ((st64)from>=0 && (st64)to<0) { to = 0; // end of file } if (from || to) { if (to && from>=to) { eprintf ("Invalid -f or -t offsets\n"); return 1; } } do_hash_seed (seed); if (hashstr) { #define INSIZE 32768 if (!strcmp (hashstr, "-")) { int res = 0; hashstr = malloc (INSIZE); if (!hashstr) return 1; res = fread ((void*)hashstr, 1, INSIZE-1, stdin); if (res<1) res = 0; hashstr[res] = '\0'; hashstr_len = res; } if (hashstr_hex) { ut8 *out = malloc ((strlen (hashstr)+1)*2); hashstr_len = r_hex_str2bin (hashstr, out); if (hashstr_len<1) { eprintf ("Invalid hex string\n"); free (out); } hashstr = (char *)out; /* out memleaks here, hashstr can't be freed */ } else { hashstr_len = strlen (hashstr); } if (from) { if (from>=hashstr_len) { eprintf ("Invalid -f.\n"); return 1; } } if (to) { if (to>hashstr_len) { eprintf ("Invalid -t.\n"); return 1; } } else { to = hashstr_len; } hashstr = hashstr+from; hashstr_len = to-from; hashstr[hashstr_len] = '\0'; hashstr_len = r_str_unescape (hashstr); switch (b64mode) { case 1: // encode { char *out = malloc (((hashstr_len+1)*4)/3); if (out) { r_base64_encode (out, (const ut8*)hashstr, hashstr_len); printf ("%s\n", out); fflush (stdout); free (out); } } break; case 2: // decode { ut8 *out = malloc (INSIZE); if (out) { int outlen = r_base64_decode (out, (const char *)hashstr, hashstr_len); write (1, out, outlen); free (out); } } break; default: { char *str = (char *)hashstr; int strsz = hashstr_len; if (_s) { // alloc/concat/resize str = malloc (strsz + s.len); if (s.prefix) { memcpy (str, s.buf, s.len); memcpy (str+s.len, hashstr, hashstr_len); } else { memcpy (str, hashstr, hashstr_len); memcpy (str+strsz, s.buf, s.len); } strsz += s.len; str[strsz] = 0; } algobit = r_hash_name_to_bits (algo); for (i=1; i<0x800000; i<<=1) { if (algobit & i) { int hashbit = i & algobit; ctx = r_hash_new (R_TRUE, hashbit); from = 0; to = strsz; do_hash_internal (ctx, hashbit, (const ut8*)str, strsz, rad, 1, ule); r_hash_free (ctx); } } if (_s) { free (str); free (s.buf); } } } return 0; } if (optind>=argc) return do_help (1); if (numblocks) { bsize = -bsize; } else if (bsize<0) { eprintf ("rahash2: Invalid block size\n"); return 1; } io = r_io_new (); for (ret=0, i=optind; i<argc; i++) { switch (b64mode) { case 1: // encode { int binlen; char *out; ut8 *bin = (ut8*)r_file_slurp (argv[i], &binlen); if (!bin) { eprintf ("Cannot open file\n"); continue; } out = malloc (((binlen+1)*4)/3); if (out) { r_base64_encode (out, bin, binlen); printf ("%s\n", out); fflush (stdout); free (out); } free (bin); } break; case 2: // decode { int binlen, outlen; ut8 *out, *bin = (ut8*)r_file_slurp (argv[i], &binlen); if (!bin) { eprintf ("Cannot open file\n"); continue; } out = malloc (binlen+1); if (out) { outlen = r_base64_decode (out, (const char*)bin, binlen); write (1, out, outlen); free (out); } free (bin); } break; default: if (r_file_is_directory (argv[i])) { eprintf ("rahash2: Cannot hash directories\n"); return 1; } if (!r_io_open_nomap (io, argv[i], 0, 0)) { eprintf ("rahash2: Cannot open '%s'\n", argv[i]); return 1; } ret |= do_hash (argv[i], algo, io, bsize, rad, ule); } } free (hashstr); r_io_free (io); return ret; }