about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2021-08-17 16:03:03 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2021-08-17 16:06:31 +0200
commit856c8d1f7b00593e3cc4605d2dc835d9fc46effa (patch)
treee12c6cf00c9832e0782cc16edf71580e789802b2
parent24642064db3f1b432f5498ad07abb04bcdf3a008 (diff)
downloadmiasm-856c8d1f7b00593e3cc4605d2dc835d9fc46effa.tar.gz
miasm-856c8d1f7b00593e3cc4605d2dc835d9fc46effa.zip
Fix interference computation
-rw-r--r--miasm/analysis/data_flow.py12
1 files changed, 8 insertions, 4 deletions
diff --git a/miasm/analysis/data_flow.py b/miasm/analysis/data_flow.py
index b22c4f83..ae44ed59 100644
--- a/miasm/analysis/data_flow.py
+++ b/miasm/analysis/data_flow.py
@@ -1926,16 +1926,20 @@ class State(object):
                     # Special case:
                     # @32[ESP + 0xFFFFFFFE], @32[ESP]
                     # Both memories alias
-                    if offset1 <= int(base1.mask) - size1:
+                    if offset1 + size1 <= int(base1.mask) + 1:
+                        # @32[ESP + 0xFFFFFFFC] => [0xFFFFFFFC, 0xFFFFFFFF]
                         interval1 = interval([(offset1, offset1 + dst.size // 8 - 1)])
                     else:
+                        # @32[ESP + 0xFFFFFFFE] => [0x0, 0x1] U [0xFFFFFFFE, 0xFFFFFFFF]
                         interval1 = interval([(offset1, int(base1.mask))])
-                        interval1 += interval([(0, int(base1.mask) - offset1 )])
-                    if offset2 <= int(base2.mask) - size2:
+                        interval1 += interval([(0, size1 - (int(base1.mask) + 1 - offset1) - 1 )])
+                    if offset2 + size2 <= int(base2.mask) + 1:
+                        # @32[ESP + 0xFFFFFFFC] => [0xFFFFFFFC, 0xFFFFFFFF]
                         interval2 = interval([(offset2, offset2 + src.size // 8 - 1)])
                     else:
+                        # @32[ESP + 0xFFFFFFFE] => [0x0, 0x1] U [0xFFFFFFFE, 0xFFFFFFFF]
                         interval2 = interval([(offset2, int(base2.mask))])
-                        interval2 += interval([(0, int(base2.mask) - offset2 )])
+                        interval2 += interval([(0, size2 - (int(base2.mask) + 1 - offset2) - 1)])
                     if (interval1 & interval2).empty:
                         continue
                     return True