Rust 如何执行与LLVM前端可执行文件兼容的机器外壳代码的原始字节

Rust 如何执行与LLVM前端可执行文件兼容的机器外壳代码的原始字节,rust,clang,llvm,ffi,Rust,Clang,Llvm,Ffi,我试图直接从Rust执行一些x86机器代码,这些代码执行jmp$(\xeb\xfe),但可执行文件崩溃了 我用GCC编译器在C中成功地实现了这一点,但它也会因Clang而崩溃: #包括 字符代码[]=“\xeb\xfe”; int main(int argc,字符**argv){ int(*func)(); func=(int(*)()代码; (int)(*func)(); } 为了在纯Rust中实现这一点,我将字节数组转换为空指针(*const()),然后将其转换为不安全的外部“C”fn()

我试图直接从Rust执行一些x86机器代码,这些代码执行
jmp$
\xeb\xfe
),但可执行文件崩溃了

我用GCC编译器在C中成功地实现了这一点,但它也会因Clang而崩溃:

#包括
字符代码[]=“\xeb\xfe”;
int main(int argc,字符**argv){
int(*func)();
func=(int(*)()代码;
(int)(*func)();
}
为了在纯Rust中实现这一点,我将字节数组转换为空指针(
*const()
),然后将其转换为不安全的外部“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(());
}
静态外壳代码:[u8;73]=*b“\xeb\xfe”;
fn main()->std::io::Result{
让原始:不安全的外部“C”fn()->=
不安全的{std::mem::transmute(&shellcode.as_ptr()as*const u as*const())};
不安全的{raw()};
返回Ok(());
}
我已经读过了,答案基本上是我所做的,所以我有点困惑


我已经编译了x86/x64的锈迹代码,并且两者都崩溃了,我认为“外壳代码”与LLVM不兼容。

我认为是因为缓冲区没有执行标志,我不确定,但您可以尝试使用将可执行标志添加到缓冲区。

我认为是因为缓冲区没有执行标志,我不确定,但您可以尝试使用将可执行标志添加到缓冲区。

您的字节是否标记为可执行?如果它们是
静态的
,我想不会。你说的“标记为可执行文件”是什么意思?我还试图将
shellcode
声明为一个公共变量,从逻辑上讲它也崩溃了。您是否使用Clang以与crust相同的设置编译C,并编译目标?我对Windows了解不多,对Rust/Windows了解更少,但我相信至少有两个常用的工具链,我看到了嵌入在“可执行文件”中的
msvcrt.dll
。使用相同的工具链(LLVM前端除外)是排除一系列可能问题的逻辑方法。另一个问题还使用mmap创建一个可执行(
MapOption::MapExecutable
)内存缓冲区,将所有数据复制到其中,然后从该空间执行。我想试试这个。它会安装病毒、窃取我的密码或使我的计算机崩溃吗?你的字节标记为可执行吗?如果它们是
静态的
,我想不会。你说的“标记为可执行文件”是什么意思?我还试图将
shellcode
声明为一个公共变量,从逻辑上讲它也崩溃了。您是否使用Clang以与crust相同的设置编译C,并编译目标?我对Windows了解不多,对Rust/Windows了解更少,但我相信至少有两个常用的工具链,我看到了嵌入在“可执行文件”中的
msvcrt.dll
。使用相同的工具链(LLVM前端除外)是排除一系列可能问题的逻辑方法。另一个问题还使用mmap创建一个可执行(
MapOption::MapExecutable
)内存缓冲区,将所有数据复制到其中,然后从该空间执行。我想试试这个。它会安装病毒、窃取我的密码或使我的计算机崩溃吗?