Поскольку вы уже можете вводить код, вы, вероятно, располагаете свой код на странице с разрешением write + exec, чтобы вы могли сделать его самоизменяющимся и сохранять байты для инструкции syscall
по одной (поэтому они нене фильтруется как часть imm16).
Или, что еще проще, начните с 0e 05 ...
в памяти и используйте inc byte ptr syscall_location[rip]
, чтобы изменить его на 0f 05 ...
.Режим относительной RIP-адресации означает, что вам не нужно знать адрес байта, который вы хотите изменить, просто его относительное расстояние (которое ассемблер рассчитает для вас).Возможно, вам придется перейти вперед, чтобы rel32
было отрицательным и не содержало нулевых байтов.Или сначала поместите инструкцию syscall
и вернитесь к ней.
Как указывает Синкману, вы можете найти инструкцию syscall
где-нибудь на карте памяти процесса, и в этом случае методы, которые вы используете дляret2reg может работать.
Но код совместно используемой библиотеки будет иметь тенденцию быть ASLRed относительно исполняемого файла, и если в основном исполняемом файле нет заглушки PLT для sendfile
, динамический компоновщик не сможет найти его.