11from pandare import Panda
22
3- panda = Panda (generic = "i386" )
3+ panda = Panda (generic = "arm" )
4+ #panda = Panda(generic="i386")
5+ #panda = Panda(generic="x86_64")
6+ #panda = Panda(generic="mips64")
7+
48panda .load_plugin ("syscalls2" , {"load-info" : True })
59
610@panda .queue_blocking
711def drive ():
812 panda .revert_sync ('root' )
9- print (panda .run_serial_cmd ("md5sum $(which whoami); find /etc/ | md5sum" ))
13+ print (panda .run_serial_cmd ("md5sum $(which whoami); find /etc/ | md5sum; apt-get update -yy " ))
1014 panda .end_analysis ()
1115
16+ last_fault = None
17+ def fault (panda , cpu , addr , pc ):
18+ global last_fault
19+ if last_fault == addr :
20+ raise MemoryError (f"Double fault of { addr :x} " )
21+ last_fault = addr
22+ panda .libpanda .panda_page_fault (cpu , addr , pc )
23+
24+
1225@panda .ppp ("syscalls2" , "on_all_sys_enter2" )
1326def all_sys (cpu , pc , call , rp ):
1427 args = panda .ffi .cast ("target_ulong**" , rp .args )
1528
16- print (f"{ pc :#08x} (from block starting at { panda .current_pc (cpu ):#08x} ): { panda .ffi .string (call .name ).decode ()} (" , end = "" )
29+ sc_name = panda .ffi .string (call .name ).decode () if call .name != panda .ffi .NULL else 'err'
30+ print (f"{ pc :#08x} (from block starting at { panda .current_pc (cpu ):#08x} ): { sc_name } (" , end = "" )
1731 if call .nargs == 0 :
1832 print (")" , end = "" )
1933
@@ -25,29 +39,29 @@ def all_sys(cpu, pc, call, rp):
2539 if call .argt [i ] not in [0x20 , 0x21 , 0x22 ]:
2640 val = int (panda .ffi .cast ("unsigned int" , args [i ]))
2741 print (hex (val ), end = "" )
42+ continue
43+
44+ # It's a pointer type
45+ addr = int (panda .ffi .cast ("unsigned int" , args [i ]))
46+ if addr < 0xFFFF :
47+ # Probably not a pointer?
48+ print (hex (addr ), end = "" )
2849 else :
29- addr = int (panda .ffi .cast ("unsigned int" , args [i ]))
30- if addr < 0xFFFF :
31- # Probably not a pointer?
32- print (hex (addr ), end = "" )
33- else :
34- try :
35- mem = panda .virtual_memory_read (cpu , addr , 8 )
36- except ValueError :
37- # ignore other args until fault is resolved
50+ try :
51+ s = panda .read_str (cpu , addr )
52+ except ValueError :
53+ # This argument can't be read - let's raise a fault on it
54+ if last_fault != addr :
3855 print (f"{ addr :#x} => Can't read - INJECT PANDA PAGE FAULT" ) # newline
56+ fault (panda , cpu , addr , pc )
57+ return # Raised a fault, hope it's gonna work
58+ else :
59+ s = "still can't read"
3960
40- # DO FAULT
41- panda .libpanda .panda_page_fault (cpu , addr , pc )
42- # After fault is handled, we'll then re-run the syscall insn (and the TCG-based callback)
43- break
44-
45- # No fault
46- print (f"{ addr :#x} => { repr (panda .read_str (cpu , addr ))} " , end = "" )
61+ # No fault
62+ print (f"{ addr :#x} => { repr (s )} " , end = "" )
4763
4864 print (sep , end = "" ) # , or )
49- else :
50- print ()
5165
5266@panda .ppp ("syscalls2" , "on_all_sys_return2" )
5367def all_ret (cpu , pc , call , rp ):
0 commit comments