Как выполнить необработанные байты машинного шелл-кода, совместимого с исполняемыми файлами внешнего интерфейса LLVM - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь выполнить некоторый машинный код 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.

...