def testMultiSymbolic(self): my_solver = Solver() mem = SMemory(my_solver, 32, 12) #alloc/map a little mem size = 0x10000 addr = mem.mmap(None, size, 'rwx') #initialize first 10 bytes as [100, 101, 102, .. 109] for i in xrange(addr, addr+10): mem.putchar(i, chr(100+i-addr)) #Make a char that ranges from 'A' to 'Z' v = my_solver.mkBitVec(32) my_solver.add(v>=ord('A')) my_solver.add(v<=ord('Z')) #assign it to the firt 10 bytes mem.putchar(addr+5, chr(v)) #mak a free symbol of 32 bits x = my_solver.mkBitVec(32) #constraint it to range into [addr, addr+10) my_solver.add(x>=addr) my_solver.add(x<addr+10) #so now lets ask the memory for values pointed by addr c = mem.getchar(x) for val in my_solver.getallvalues(c,1000): self.assertTrue(val>=100 and val<110 or val >= ord('A') and val <= ord('Z'))
def test_one_concrete_one_symbolic(self): #global mainsolver my_solver = Solver() mem = SMemory(my_solver, 32, 12) addr_for_symbol1 = mem.mmap(None, 0x1000, 'rwx') mem.putchar(addr_for_symbol1, 'A') symbol1 = my_solver.mkBitVec(8) my_solver.add(OR(symbol1==ord('B'), symbol1==ord('C'))) mem.putchar(addr_for_symbol1+1, symbol1) values = list(my_solver.getallvalues(symbol1)) self.assertIn(ord('B'), values) self.assertIn(ord('C'), values) symbol2 = my_solver.mkBitVec(32) my_solver.add(symbol2>=addr_for_symbol1) my_solver.add(symbol2<=addr_for_symbol1+1) c = mem.getchar(symbol2) self.assertTrue(issymbolic(c)) values = list(my_solver.getallvalues(c)) self.assertIn(ord('A'), values) self.assertIn(ord('B'), values) self.assertIn(ord('C'), values)