2026-09-01 (Remote Syscall Gadget & Non-Spinning Exit Path) (D307)
Analyzed hardware test log (Run #19):
- Diagnosis:
target thread RIP=0x21ce77975: In Run #18,obscene_startactually executed all test suites (obs_run_all) and reached the end ofobscene_start(0x5f7975), where it was spinning in thefor (;;) { pause; }loop.- When the injector attached to the target process in Run #19, the
thread was stopped inside that loop instead of a
libkernelsyscall trampoline. procctl_remote_syscallassumed whatever instructionRIPwas pointing at would execute a syscall. Steppingjmp 0x5f7975simply repeated the jump 2000 times until timing out, leavingrax=0x1dd(477), which brokeremote_mmap.
- Remediation:
- Syscall Gadget Discovery
(
src/injector/procctl.c,procctl.h): Implementedprocctl_find_syscall_gadget()which checkslibkernel_base + 0x5ba(getpid + 0xa) for0x0f 0x05(syscall) or scanslibkerneltext for asyscallgadget. - Single-Step Remote Syscall Execution
(
src/injector/procctl.c):procctl_remote_syscall()now setsjmp_reg.r_rip = s_remote_syscall_gadgetand executes exactly 1 single-step, capturingraxand restoring original registers immediately without looping or timeouts. - Validation in
procctl_remote_mmap: Rejects invalid addresses (< 0x10000or> 0x00007fffffffffff). - Thread Exit Path Conformance
(
src/probe/start.c): Replacedfor (;;) { pause; }at the end ofobscene_startwithreturn;, allowing the hijacked game thread to pop its saved return RIP and cleanly resume running retail game frames after the probe completes.
- Syscall Gadget Discovery
(
Verified: make payload injector HARDWARE=1
(9,411,064 bytes) compiles 100% clean with zero warnings
and zero errors.