diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2021-08-03 16:38:13 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-03 16:38:13 +0200 |
| commit | 24642064db3f1b432f5498ad07abb04bcdf3a008 (patch) | |
| tree | 5f3415bddbdccf49c4bc7468a244a8781656ca16 | |
| parent | fcb324e04e11feb7f6f5aa51ec60f67f24b040e3 (diff) | |
| parent | 171db6a594364b3f045a7a4a634ccf76c6786724 (diff) | |
| download | miasm-24642064db3f1b432f5498ad07abb04bcdf3a008.tar.gz miasm-24642064db3f1b432f5498ad07abb04bcdf3a008.zip | |
Merge pull request #1377 from serpilliere/fix_interfer_computation
Fix interfer computation
| -rw-r--r-- | miasm/analysis/data_flow.py | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/miasm/analysis/data_flow.py b/miasm/analysis/data_flow.py index 0a66447c..b22c4f83 100644 --- a/miasm/analysis/data_flow.py +++ b/miasm/analysis/data_flow.py @@ -1921,10 +1921,21 @@ class State(object): base2, offset2 = get_expr_base_offset(src.ptr) if base1 != base2: return True - assert offset1 + dst.size // 8 - 1 <= int(base1.mask) - assert offset2 + src.size // 8 - 1 <= int(base2.mask) - interval1 = interval([(offset1, offset1 + dst.size // 8 - 1)]) - interval2 = interval([(offset2, offset2 + src.size // 8 - 1)]) + size1 = dst.size // 8 + size2 = src.size // 8 + # Special case: + # @32[ESP + 0xFFFFFFFE], @32[ESP] + # Both memories alias + if offset1 <= int(base1.mask) - size1: + interval1 = interval([(offset1, offset1 + dst.size // 8 - 1)]) + else: + interval1 = interval([(offset1, int(base1.mask))]) + interval1 += interval([(0, int(base1.mask) - offset1 )]) + if offset2 <= int(base2.mask) - size2: + interval2 = interval([(offset2, offset2 + src.size // 8 - 1)]) + else: + interval2 = interval([(offset2, int(base2.mask))]) + interval2 += interval([(0, int(base2.mask) - offset2 )]) if (interval1 & interval2).empty: continue return True |