diff --git a/utils/noaslr/noaslr/Cargo.toml b/utils/noaslr/noaslr/Cargo.toml index 01d584e0be..4b224c4fee 100644 --- a/utils/noaslr/noaslr/Cargo.toml +++ b/utils/noaslr/noaslr/Cargo.toml @@ -13,4 +13,6 @@ log = { version = "0.4.19", default-features = false } nix = { version = "0.26.2", default-features = false, features = ["process", "personality"] } readonly = { version = "0.2.8", default-features = false } simplelog = { version = "0.12.1", default-features = false } + +[target.'cfg(any(target_os = "freebsd", target_os = "dragonfly"))'.dependencies] libc = "0.2" diff --git a/utils/noaslr/noaslr/src/main.rs b/utils/noaslr/noaslr/src/main.rs index 53005eec5b..fa4e3afde0 100644 --- a/utils/noaslr/noaslr/src/main.rs +++ b/utils/noaslr/noaslr/src/main.rs @@ -8,6 +8,7 @@ use { nix::unistd::execvp, std::ffi::CString, }; + #[cfg(any(target_os = "linux", target_os = "android"))] use { crate::args::Args, @@ -28,7 +29,7 @@ fn disable_aslr() -> Result<()> { Ok(()) } -#[cfg(not(any(target_os = "linux", target_os = "android")))] +#[cfg(target_os = "freebsd")] fn disable_aslr() -> Result<()> { let mut status = libc::PROC_ASLR_FORCE_DISABLE; let r = unsafe { @@ -45,6 +46,27 @@ fn disable_aslr() -> Result<()> { Ok(()) } +#[cfg(target_os = "dragonfly")] +fn disable_aslr() -> Result<()> { + unsafe { + let disable: i32 = 0; + let s = std::mem::size_of::(); + let nm = CString::new("vm.randomize_mmap") + .map_err(|e| anyhow!("Failed to create sysctl oid: {e:}")) + .unwrap(); + if libc::sysctlbyname( + nm.as_ptr(), + std::ptr::null_mut(), + std::ptr::null_mut(), + &disable as *const i32 as _, + s, + ) < 0 { + return Err(anyhow!("Failed to disable aslr")); + } + } + Ok(()) +} + fn main() -> Result<()> { let args = Args::parse();