Skip to content

Commit 016eed4

Browse files
authored
Merge pull request #985 from serpilliere/fix_propagation
Fix propagation
2 parents 9c063fb + 6f67a55 commit 016eed4

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

example/disasm/full.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,9 +330,20 @@ def do_simplify(self, ssa, head):
330330
modified = super(CustomIRCFGSimplifierSSA, self).do_simplify(ssa, head)
331331
if args.loadint:
332332
modified |= load_from_int(ssa.graph, bs, is_addr_ro_variable)
333+
334+
def simplify(self, ircfg, head):
335+
ssa = self.ircfg_to_ssa(ircfg, head)
336+
ssa = self.do_simplify_loop(ssa, head)
337+
ircfg = self.ssa_to_unssa(ssa, head)
338+
333339
if args.stack2var:
334-
modified |= replace_stack_vars(self.ir_arch, ssa)
335-
return modified
340+
replace_stack_vars(self.ir_arch, ircfg)
341+
342+
ircfg_simplifier = IRCFGSimplifierCommon(self.ir_arch)
343+
ircfg_simplifier.simplify(ircfg, head)
344+
return ircfg
345+
346+
336347

337348

338349
head = list(entry_points)[0]

miasm2/analysis/data_flow.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -900,10 +900,9 @@ def propagate(self, ssa, head, max_expr_depth=None):
900900
for dst, src in out.iteritems():
901901
if dst.is_mem():
902902
write_mem = True
903-
if dst != mem_dst and mem_dst in dst:
904-
dst = dst.replace_expr({mem_dst:mem_src})
905-
if mem_dst in src:
906-
src = src.replace_expr({mem_dst:mem_src})
903+
ptr = dst.ptr.replace_expr({mem_dst:mem_src})
904+
dst = ExprMem(ptr, dst.size)
905+
src = src.replace_expr({mem_dst:mem_src})
907906
out_new[dst] = src
908907
if out != out_new:
909908
assignblk_modified = True
@@ -990,15 +989,15 @@ def check_expr_below_stack(ir_arch_a, expr):
990989
return True
991990

992991

993-
def retrieve_stack_accesses(ir_arch_a, ssa):
992+
def retrieve_stack_accesses(ir_arch_a, ircfg):
994993
"""
995994
Walk the ssa graph and find stack based variables.
996995
Return a dictionary linking stack base address to its size/name
997996
@ir_arch_a: ira instance
998-
@ssa: SSADiGraph instance
997+
@ircfg: IRCFG instance
999998
"""
1000999
stack_vars = set()
1001-
for block in ssa.graph.blocks.itervalues():
1000+
for block in ircfg.blocks.itervalues():
10021001
for assignblk in block:
10031002
for dst, src in assignblk.iteritems():
10041003
stack_vars.update(get_stack_accesses(ir_arch_a, dst))
@@ -1064,18 +1063,23 @@ def replace_mem_stack_vars(expr, base_to_info):
10641063
return expr.visit(lambda expr:fix_stack_vars(expr, base_to_info))
10651064

10661065

1067-
def replace_stack_vars(ir_arch_a, ssa):
1066+
def replace_stack_vars(ir_arch_a, ircfg):
10681067
"""
10691068
Try to replace stack based memory accesses by variables.
1069+
1070+
Hypothesis: the input ircfg must have all it's accesses to stack explicitly
1071+
done through the stack register, ie every aliases on those variables is
1072+
resolved.
1073+
10701074
WARNING: may fail
10711075
10721076
@ir_arch_a: ira instance
1073-
@ssa: SSADiGraph instance
1077+
@ircfg: IRCFG instance
10741078
"""
10751079

1076-
base_to_info = retrieve_stack_accesses(ir_arch_a, ssa)
1080+
base_to_info = retrieve_stack_accesses(ir_arch_a, ircfg)
10771081
modified = False
1078-
for block in ssa.graph.blocks.itervalues():
1082+
for block in ircfg.blocks.itervalues():
10791083
assignblks = []
10801084
for assignblk in block:
10811085
out = {}
@@ -1090,7 +1094,7 @@ def replace_stack_vars(ir_arch_a, ssa):
10901094
out = AssignBlock(out, assignblk.instr)
10911095
assignblks.append(out)
10921096
new_block = IRBlock(block.loc_key, assignblks)
1093-
ssa.graph.blocks[block.loc_key] = new_block
1097+
ircfg.blocks[block.loc_key] = new_block
10941098
return modified
10951099

10961100

0 commit comments

Comments
 (0)