diff options
| author | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2025-10-31 17:50:44 +0000 |
|---|---|---|
| committer | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2025-10-31 17:50:44 +0000 |
| commit | f4cc4af78b3dbb5deed791bf56ec4a7e9caaf722 (patch) | |
| tree | 3b90fdf694755b227da07cb4329be8d74c2a2d06 | |
| parent | daf59c9672c9f08adfd7c2d1e355cda3868a3372 (diff) | |
| download | focaccia-f4cc4af78b3dbb5deed791bf56ec4a7e9caaf722.tar.gz focaccia-f4cc4af78b3dbb5deed791bf56ec4a7e9caaf722.zip | |
Handle exit in post-event hook
| -rw-r--r-- | src/focaccia/deterministic.py | 3 | ||||
| -rw-r--r-- | src/focaccia/symbolic.py | 32 |
2 files changed, 22 insertions, 13 deletions
diff --git a/src/focaccia/deterministic.py b/src/focaccia/deterministic.py index 3396797..f60b3ba 100644 --- a/src/focaccia/deterministic.py +++ b/src/focaccia/deterministic.py @@ -171,9 +171,6 @@ class DeterministicLog: pc, registers = parse_registers(raw_event) mem_writes = parse_memory_writes(raw_event) - if pc == 0: - pc = events[-1].pc - event = Event(pc, raw_event.tid, raw_event.arch, diff --git a/src/focaccia/symbolic.py b/src/focaccia/symbolic.py index 49e0259..ef7723a 100644 --- a/src/focaccia/symbolic.py +++ b/src/focaccia/symbolic.py @@ -780,17 +780,26 @@ class SymbolicTracer: f' mem[{hex(addr)}:{hex(addr+len(data))}] = {conc_data}.' f'\nFaulty transformation: {transform}') - def progress_event(self): - if self.next_event < len(self.nondet_events): + def progress_event(self) -> None: + if (self.next_event + 1) < len(self.nondet_events): self.next_event += 1 + debug(f'Next event to handle at index {self.next_event}') else: self.next_event = None - def post_event(self): - self.progress_event() + def post_event(self) -> None: + if self.next_event: + if self.nondet_events[self.next_event].pc == 0: + # Exit sequence + debug('Completed exit event') + self.target.run() - def is_stepping_instr(self, pc: int, instruction: Instruction): + debug(f'Completed handling event at index {self.next_event}') + self.progress_event() + + def is_stepping_instr(self, pc: int, instruction: Instruction) -> bool: if self.nondet_events: + pc = pc + instruction.length # detlog reports next pc for each event if self.next_event and self.nondet_events[self.next_event].match(pc, self.target): debug('Current instruction matches next event; stepping through it') self.progress_event() @@ -824,7 +833,10 @@ class SymbolicTracer: for i in range(len(self.nondet_events)): if self.nondet_events[i].pc == self.target.read_pc(): - self.next_event = i + self.next_event = i+1 + if self.next_event >= len(self.nondet_events): + break + debug(f'Starting from event {self.nondet_events[i]} onwards') break @@ -872,7 +884,7 @@ class SymbolicTracer: continue raise # forward exception - needs_step = self.is_stepping_instr(pc, instruction) + is_event = self.is_stepping_instr(pc, instruction) # Run instruction conc_state = MiasmSymbolResolver(self.target, ctx.loc_db) @@ -890,7 +902,7 @@ class SymbolicTracer: new_pc = int(new_pc) transform = SymbolicTransform(modified, [instruction], arch, pc, new_pc) pred_regs, pred_mems = self.predict_next_state(instruction, transform) - self.progress(new_pc, step=needs_step) + self.progress(new_pc, step=is_event) try: self.validate(instruction, transform, pred_regs, pred_mems) @@ -900,14 +912,14 @@ class SymbolicTracer: continue raise else: - new_pc = self.progress(new_pc, step=needs_step) + new_pc = self.progress(new_pc, step=is_event) if new_pc is None: continue # we're done transform = SymbolicTransform(modified, [instruction], arch, pc, new_pc) strace.append(transform) - if needs_step: + if is_event: self.post_event() return Trace(strace, self.env) |