unicorn_taint/
unicorn_taint.rs1use panda::prelude::*;
2use panda::regs::{set_reg, set_pc, Reg};
3use panda::mem::{map_memory, physical_memory_write, PAGE_SIZE};
4use panda::taint;
5
6const X86_CODE: &[u8] = b"\x48\xFF\xC0\x48\x01\xC3\x48\xFF\xC1";
10
11const ADDRESS: target_ulong = 0x1000;
12const STOP_ADDR: target_ulong = ADDRESS + (X86_CODE.len() as target_ulong);
13
14#[panda::after_machine_init] fn setup(cpu: &mut CPUState) {
17 map_memory("mymem", 2 * 1024 * PAGE_SIZE, ADDRESS).unwrap();
19
20 physical_memory_write(ADDRESS, X86_CODE);
22
23 set_reg(cpu, Reg::RAX, 0x1);
25 set_reg(cpu, Reg::RBX, 0x2);
26 set_reg(cpu, Reg::RCX, 0x3);
27 set_reg(cpu, Reg::RDX, 0x4);
28
29 for reg in [Reg::RAX, Reg::RBX, Reg::RCX, Reg::RDX] {
31 println!("{:?} is tained? {:?}", reg, taint::check_reg(reg));
32 }
33
34 println!("Tainting RAX with label '1'...");
35 taint::label_reg(Reg::RAX, 1);
36
37 println!("Tainting RBX with label '2'...");
38 taint::label_reg(Reg::RBX, 2);
39
40 set_pc(cpu, ADDRESS);
42}
43
44#[panda::insn_translate] fn insn_translate(_cpu: &mut CPUState, _pc: target_ptr_t) -> bool {
48 true
49}
50
51#[panda::insn_exec] fn insn_exec(cpu: &mut CPUState, pc: target_ptr_t) {
53 println!("pc: {:#x?}", pc);
54
55 if pc == STOP_ADDR {
57 println!("Final CPU state:");
58 panda::regs::dump_regs(cpu);
59
60 for reg in [Reg::RAX, Reg::RBX, Reg::RCX, Reg::RDX] {
61 println!("{:?} is tained? {:?}", reg, taint::check_reg(reg));
62
63 if taint::check_reg(reg) {
64 println!("(Tainted by {:?})", taint::get_reg(reg));
65 }
66 }
67
68 unsafe {
69 panda::sys::exit(0);
70 }
71 }
72}
73
74fn main() {
78 Panda::new()
79 .arch(panda::Arch::x86_64)
80 .configurable()
81 .run();
82}