diff options
| author | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2025-11-18 14:11:01 +0000 |
|---|---|---|
| committer | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2025-11-18 18:19:45 +0000 |
| commit | 5fa6cc2c48aa60ed7d6f001f32526db396b8b871 (patch) | |
| tree | 0f08701ea63978fa8571b871d7328072cb8cf172 /src | |
| parent | dcaeea54a6bef313c82dc55359deb8c27c1ecb38 (diff) | |
| download | focaccia-5fa6cc2c48aa60ed7d6f001f32526db396b8b871.tar.gz focaccia-5fa6cc2c48aa60ed7d6f001f32526db396b8b871.zip | |
Reintroduce support for emulating getrandom
Diffstat (limited to 'src')
| -rw-r--r-- | src/focaccia/qemu/_qemu_tool.py | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/focaccia/qemu/_qemu_tool.py b/src/focaccia/qemu/_qemu_tool.py index e6394e5..4a51dce 100644 --- a/src/focaccia/qemu/_qemu_tool.py +++ b/src/focaccia/qemu/_qemu_tool.py @@ -172,21 +172,30 @@ class GDBServerStateIterator: call = event.registers.get(self.arch.get_syscall_reg()) syscall = emulated_system_calls[self.arch.archname].get(call, None) - if syscall is not None and False: + if syscall is not None: info(f'Replaying system call number {hex(call)}') self.skip(post_event.pc) - next_state = GDBProgramState(self._process, gdb.selected_frame(), self.arch) + next_state = self.current_state() patchup_regs = [self.arch.get_syscall_reg(), *(syscall.patchup_registers or [])] for reg in patchup_regs: - next_state.write_register(reg, post_event.registers.get(reg)) + gdb.parse_and_eval(f'${reg}={post_event.registers.get(reg)}') for mem in post_event.mem_writes: - # TODO: handle holes - # TODO: address mapping addr, data = mem.address, mem.data - next_state.write_memory(addr, data) + for reg, value in post_event.registers.items(): + if value == addr: + addr = next_state.read_register(reg) + break + + info(f'Replaying write to {hex(addr)} with data:\n{data.hex(" ")}') + + # Insert holes into data + for hole in mem.holes: + data[hole.offset:hole.offset] = b'\x00' * hole.size + self._process.write_memory(addr, data) + return next_state return next_state |