2020-06-15 06:23:38 -05:00
|
|
|
const NUM_RUNS: usize = 10;
|
|
|
|
|
|
|
|
fn run_self(exe: &str) -> usize {
|
|
|
|
use std::process::Command;
|
|
|
|
let mut set = std::collections::HashSet::new();
|
|
|
|
|
|
|
|
let mut cmd = Command::new(exe);
|
|
|
|
cmd.arg("--report");
|
|
|
|
(0..NUM_RUNS).for_each(|_| {
|
|
|
|
set.insert(cmd.output().expect("failed to execute process").stdout);
|
|
|
|
});
|
|
|
|
set.len()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let mut args = std::env::args();
|
|
|
|
let arg0 = args.next().unwrap();
|
|
|
|
match args.next() {
|
|
|
|
Some(s) if s.eq("--report") => {
|
2024-04-14 15:39:08 -05:00
|
|
|
println!("main = {:#?}", main as fn() as usize);
|
2020-06-15 06:23:38 -05:00
|
|
|
}
|
|
|
|
Some(s) if s.eq("--test-no-aslr") => {
|
|
|
|
let cnt = run_self(&arg0);
|
|
|
|
if cnt != 1 {
|
|
|
|
eprintln!("FAIL: {} most likely ASLR", arg0);
|
|
|
|
std::process::exit(1);
|
|
|
|
}
|
|
|
|
println!("PASS: {} does no ASLR", arg0);
|
|
|
|
}
|
|
|
|
Some(s) if s.eq("--test-aslr") => {
|
|
|
|
let cnt = run_self(&arg0);
|
2020-07-13 04:26:08 -05:00
|
|
|
if cnt == 1 {
|
2020-06-15 06:23:38 -05:00
|
|
|
eprintln!("FAIL: {} most likely no ASLR", arg0);
|
|
|
|
std::process::exit(1);
|
|
|
|
}
|
|
|
|
println!("PASS: {} does ASLR", arg0);
|
|
|
|
}
|
|
|
|
Some(_) | None => {
|
|
|
|
println!("Usage: {} --test-no-aslr | --test-aslr", arg0);
|
|
|
|
std::process::exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|