Skip to content

Commit 7eff96a

Browse files
committed
Fix invalid variable delta analysis when using aaef in arm32 binary ##anal
1 parent 699f9d8 commit 7eff96a

File tree

2 files changed

+52
-8
lines changed

2 files changed

+52
-8
lines changed

libr/core/canal.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4919,9 +4919,9 @@ static ut64 delta_for_access(RAnalOp *op, RAnalVarAccessType type) {
49194919
RAnalValue *src0 = r_vector_at (&op->srcs, 0);
49204920
RAnalValue *src1 = r_vector_at (&op->srcs, 1);
49214921
if (type == R_ANAL_VAR_ACCESS_TYPE_WRITE) {
4922-
if (dst) {
4923-
return dst->imm + dst->delta;
4924-
}
4922+
// XXX fix invalid var analysis when using esil
4923+
return 0;
4924+
// if (dst) { return dst->imm + dst->delta; }
49254925
} else {
49264926
if (src1 && (src1->imm || src1->delta)) {
49274927
return src1->imm + src1->delta;
@@ -4941,17 +4941,20 @@ static void handle_var_stack_access(REsil *esil, ut64 addr, RAnalVarAccessType t
49414941
const char *regname = reg_name_for_access (ctx->op, type);
49424942
if (ctx->fcn && regname) {
49434943
ut64 spaddr = r_reg_getv (esil->anal->reg, ctx->spname);
4944+
// XXX the delte computed here is incorrect because in esil that state can be inconsistent with the function boundaries
4945+
// XXX and that causes some var names to be incorrectly identified
49444946
if (addr >= spaddr && addr < ctx->initial_sp) {
49454947
int stack_off = addr - ctx->initial_sp;
49464948
// int stack_off = ctx->initial_sp - addr; // R2STACK
49474949
// eprintf (" (%llx) %llx = %d\n", ctx->initial_sp, addr, stack_off);
49484950
RAnalVar *var = r_anal_function_get_var (ctx->fcn, R_ANAL_VAR_KIND_SPV, stack_off);
4949-
if (!var) {
4950-
var = r_anal_function_get_var (ctx->fcn, R_ANAL_VAR_KIND_BPV, stack_off);
4951+
if (var) {
4952+
R_LOG_DEBUG ("Do not reanalyze an already defined variable");
4953+
return;
49514954
}
4955+
var = r_anal_function_get_var (ctx->fcn, R_ANAL_VAR_KIND_BPV, stack_off);
49524956
if (!var && stack_off >= -ctx->fcn->maxstack) {
4953-
char *varname;
4954-
varname = ctx->fcn->anal->opt.varname_stack
4957+
char *varname = ctx->fcn->anal->opt.varname_stack
49554958
? r_str_newf (VARPREFIX"_%xh", R_ABS (stack_off))
49564959
: r_anal_function_autoname_var (ctx->fcn, R_ANAL_VAR_KIND_SPV, VARPREFIX, delta_for_access (ctx->op, type));
49574960
var = r_anal_function_set_var (ctx->fcn, stack_off, R_ANAL_VAR_KIND_SPV, NULL, len, false, varname);
@@ -4975,6 +4978,7 @@ static bool is_stack(RIO *io, ut64 addr) {
49754978
}
49764979

49774980
static bool esilbreak_mem_write(REsil *esil, ut64 addr, const ut8 *buf, int len) {
4981+
// XXX causes invalid var names
49784982
handle_var_stack_access (esil, addr, R_ANAL_VAR_ACCESS_TYPE_WRITE, len);
49794983
// ignore writes in stack
49804984
if (myvalid (mycore->io, addr) && r_io_read_at (mycore->io, addr, (ut8*)buf, len)) {
@@ -5377,7 +5381,7 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
53775381
return;
53785382
}
53795383
iend = end - start;
5380-
if (iend < 0) {
5384+
if (iend < 1) {
53815385
return;
53825386
}
53835387
if (iend > MAX_SCAN_SIZE) {
@@ -5683,6 +5687,9 @@ R_API void r_core_anal_esil(RCore *core, const char *str /* len */, const char *
56835687
}
56845688
}
56855689
break;
5690+
case R_ANAL_OP_TYPE_STORE:
5691+
// TODO: the same as we do for load imho
5692+
break;
56865693
case R_ANAL_OP_TYPE_LOAD:
56875694
{
56885695
ut64 dst = esilbreak_last_read;

test/db/anal/arm

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,3 +1155,40 @@ EXPECT=<<EOF
11551155
0x00008470 10482de9 push {r4, fp, lr}
11561156
EOF
11571157
RUN
1158+
1159+
1160+
NAME=invalid varname after esil
1161+
FILE=bins/elf/blah.bin
1162+
CMDS=<<EOF
1163+
s main
1164+
af
1165+
aaef
1166+
pd 12
1167+
EOF
1168+
EXPECT=<<EOF
1169+
;-- pc:
1170+
;-- r15:
1171+
/ 484: int main (int argc, char **argv);
1172+
| ; arg int argc @ r0
1173+
| ; arg char **argv @ r1
1174+
| ; var int32_t var_10h @ fp-0x10
1175+
| ; var int32_t var_14h @ fp-0x14
1176+
| ; var int32_t var_18h @ fp-0x18
1177+
| ; var int32_t var_1ch @ fp-0x1c
1178+
| ; var int32_t var_20h @ fp-0x20
1179+
| ; var int32_t var_24h @ fp-0x24
1180+
| ; var int32_t var_8h @ sp+0x18
1181+
| 0x00008470 10482de9 push {r4, fp, lr}
1182+
| 0x00008474 08b08de2 add fp, var_8h
1183+
| 0x00008478 1cd04de2 sub sp, sp, 0x1c
1184+
| 0x0000847c 20000be5 str r0, [var_20h] ; 0x20 ; 32 ; argc
1185+
| 0x00008480 24100be5 str r1, [var_24h] ; 0x24 ; 36 ; argv
1186+
| 0x00008484 0630a0e3 mov r3, 6
1187+
| 0x00008488 10300be5 str r3, [var_10h] ; 0x10 ; 16
1188+
| 0x0000848c 0030a0e3 mov r3, 0
1189+
| 0x00008490 14300be5 str r3, [var_14h] ; 0x14 ; 20
1190+
| 0x00008494 20301be5 ldr r3, [var_20h] ; 0x20 ; 32
1191+
| 0x00008498 020053e3 cmp r3, 2 ; 2
1192+
| ,=< 0x0000849c 0300000a beq 0x84b0
1193+
EOF
1194+
RUN

0 commit comments

Comments
 (0)