Я пытаюсь выполнить некоторый машинный код x86, который выполняет jmp $
(\xeb\xfe
) напрямую из Rust, но исполняемый файл просто падает.
Я успешно сделал это в C с помощью компилятора GCC, но этотакже вылетает с Clang:
#include <stdio.h>
char code[] = "\xeb\xfe";
int main(int argc, char **argv){
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
Чтобы сделать это в чистом Rust, я преобразовал свой байтовый массив в указатель void (*const ()
), а затем преобразовал его в unsafe extern "C" fn () -> !
с std::mem::transmute
:
static shellcode: [u8; 73] = *b"\xeb\xfe";
fn main() -> std::io::Result<()> {
let raw: unsafe extern "C" fn() -> ! =
unsafe { std::mem::transmute(&shellcode.as_ptr() as *const _ as *const ()) };
unsafe { raw() };
return Ok(());
}
Я уже прочитал Как выполнить необработанные инструкции из буфера памяти в Rust? и ответ в основном то, что я сделал, поэтому я немного растерялся ...
Я скомпилировал код Rust для x86 / x64, и оба зависли, я думаю, что «шеллкод» не совместим с LLVM.