about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorserpilliere <serpilliere@users.noreply.github.com>2021-08-03 16:38:13 +0200
committerGitHub <noreply@github.com>2021-08-03 16:38:13 +0200
commit24642064db3f1b432f5498ad07abb04bcdf3a008 (patch)
tree5f3415bddbdccf49c4bc7468a244a8781656ca16
parentfcb324e04e11feb7f6f5aa51ec60f67f24b040e3 (diff)
parent171db6a594364b3f045a7a4a634ccf76c6786724 (diff)
downloadmiasm-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.py19
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