Initial commit

This commit is contained in:
DavidOnTop 2024-01-28 18:20:01 +01:00
parent fc16497ceb
commit d39b360d76
No known key found for this signature in database
GPG key ID: FAB914DDC2F180EB
10 changed files with 80 additions and 1186 deletions

View file

@ -1 +0,0 @@

View file

@ -1,3 +1,33 @@
use std::os::fd::FromRawFd;
fn main() {
println!("Hello, world!");
let file = if std::fs::metadata("target/release/testexec").is_ok() {
std::fs::File::open("target/release/testexec").unwrap()
} else if std::fs::metadata("target/debug/testexec").is_ok() {
std::fs::File::open("target/debug/testexec").unwrap()
} else {
panic!("testexec not found");
};
let filename = "testexec";
let name = std::ffi::CString::new(filename).unwrap();
let name = name.as_ptr();
let mem_file_fd = unsafe { libc::memfd_create(name, 0) };
let mem_file = unsafe { std::fs::File::from_raw_fd(mem_file_fd) };
let mut reader = std::io::BufReader::new(file);
let mut writer = std::io::BufWriter::new(&mem_file);
std::io::copy(&mut reader, &mut writer).unwrap();
let filepath = std::ffi::CString::new(format!("/proc/self/fd/{}", mem_file_fd)).unwrap();
let filepath = filepath.as_ptr();
let argv_owned = vec![std::ffi::CString::new(filename).unwrap()];
let argv: Vec<*const libc::c_char> = argv_owned.iter().map(|x| x.as_ptr()).chain(std::iter::once(std::ptr::null())).collect();
let envp_owned = std::env::vars_os()
.map(|(k, v)| {
let mut kv = k.into_string().unwrap();
kv.push('=');
kv.push_str(&v.into_string().unwrap());
std::ffi::CString::new(kv).unwrap()
}).collect::<Vec<_>>();
let envp: Vec<*const libc::c_char> = envp_owned.iter().map(|x| x.as_ptr()).chain(std::iter::once(std::ptr::null())).collect();
unsafe { libc::execve(filepath, argv.as_ptr(), envp.as_ptr()) };
}