@@ -41,6 +41,9 @@ class QueryType(Enum):
41
41
SYSCALL = "syscall"
42
42
INT80 = "int 0x80"
43
43
44
+ def isMemWriteQuery (qtype ):
45
+ return (qtype in [QueryType .CSTtoMEM , QueryType .REGtoMEM , QueryType .MEMtoMEM ])
46
+
44
47
#######################
45
48
# List of all gadgets #
46
49
#######################
@@ -101,6 +104,7 @@ def add(self, cst, gadget_num, preCond = CTrue() ):
101
104
self .preConditions [cst ].insert (index , preCond )
102
105
103
106
def find (self , cst , constraint , assertion , enablePreConds = False , n = 1 , maxSpInc = None ):
107
+ global gadgets
104
108
res = []
105
109
if ( not cst in self .values ):
106
110
return []
@@ -426,7 +430,7 @@ def possibleMemWrites(self, reg, cst, constraint, assertion, n=1):
426
430
427
431
def possibleAddressWrites (self , reg , cst , constraint , assertion , n = 1 ):
428
432
"""
429
- : : nb of gadgets for each case !!
433
+ n : nb of gadgets for each case !!
430
434
"""
431
435
global gadgets
432
436
res = dict ()
@@ -443,6 +447,25 @@ def possibleAddressWrites(self, reg, cst, constraint, assertion, n=1):
443
447
if ( addr_cst not in reg [addr_reg ]):
444
448
res [addr_reg ][addr_cst ] = []
445
449
res [addr_reg ][addr_cst ] += found
450
+
451
+ def allPossibleWrites (self , constraint , assertion ):
452
+ """
453
+ n : nb of gadgets for each case
454
+ """
455
+ global gadgets
456
+ res = []
457
+ for addr_reg in self .types [QueryType .REGtoMEM ].registers .keys ():
458
+ for addr_cst in self .types [QueryType .REGtoMEM ].registers [addr_reg ]:
459
+ # Get the lookUp for list of deps for MEM(addr_reg, addr_cst)
460
+ lookUp = self .types [QueryType .REGtoMEM ].registers [addr_reg ][addr_cst ]
461
+ # Iterate through reg and cst
462
+ for reg in lookUp .registers .keys ():
463
+ for cst in lookUp .registers [reg ].values .keys ():
464
+ gadget_list = lookUp .registers [reg ].find (cst , constraint , assertion , n = 1 )
465
+ if ( gadget_list ):
466
+ res .append (((addr_reg , addr_cst ),(reg ,cst ),gadget_list [0 ]))
467
+ return res
468
+
446
469
447
470
448
471
########################
@@ -476,6 +499,13 @@ def DBPossibleAddressWrites(reg, cst, constraint, assertion, n=1):
476
499
Return the list of [addr_reg, addr_cst] such than mem(addr_reg, addr_cst) <- reg+cst
477
500
"""
478
501
return db .possibleAddressWrites (reg , cst , constraint , assertion , n )
502
+
503
+ def DBAllPossibleWrites (constraint , assertion ):
504
+ """
505
+ Return a list of [(addr_reg, addr_cst), (reg, cst), gadget]
506
+ s.t gadget does: mem(addr_reg, addr_cst) <- reg+cst !
507
+ """
508
+ return db .allPossibleWrites (constraint , assertion )
479
509
480
510
#############################
481
511
# Build the list of gadgets #
@@ -556,3 +586,42 @@ def initDB():
556
586
global db , gadgets
557
587
gadgets = []
558
588
db = Database ()
589
+
590
+
591
+ ###################
592
+ # Utils functions #
593
+ ###################
594
+ _offset = 0
595
+ def set_gadgets_offset ( offset ):
596
+ """
597
+ adds offset to all gadget addresses
598
+ returns True if success
599
+ returns False if fail
600
+ """
601
+ global gadgets , _offset
602
+
603
+ i = 0
604
+ _offset = offset
605
+ for gadget in gadgets :
606
+ if ( not gadget .addOffset (offset )):
607
+ reset_gadgets_offset (i )
608
+ return False
609
+ i += 1
610
+ _offset = offset
611
+ return True
612
+
613
+ def reset_gadgets_offset (gadget_num = - 1 ):
614
+ """
615
+ decrements gadget addresses by offset until gadget_num (NOT included)
616
+ if gadget_num = -1, do it for all gadgets
617
+ """
618
+ global _offset , gadgets
619
+ if ( gadget_num <= 0 ):
620
+ gadget_num = len (gadgets )
621
+ i = 0
622
+ for gadget in gadgets :
623
+ if ( i >= gadget_num ):
624
+ return
625
+ gadget .addOffset (- 1 * _offset )
626
+ i += 1
627
+ _offset = 0
0 commit comments