diff --git a/README.md b/README.md index f46b11307009b5b4bd00a558cd81ba39b1651d9a..1619632d5ba5c7394d2163e2e31b78f402b5b044 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,40 @@ +# Decryptor for the Cortex-M +## Requirements +STM32F401 Nucleo-64 + +Rust + +## Description +This implementation of code is made to be run ontop of a microcontroller. +Specifically a STM32F401 Nucleo-64 microcontroller. + + +The program is able to, given a seed-number, determine the decoded values +of an array of integers, which are in its original state an encoded string of text. +That is, given a string encoded in a specific way, this program can decode it. + +## How to use +There exist three .sh scripts ready to be used for quick and simple compilation/debugging/running. + +compile.sh +- Builds using cargo onto the target thumbv7em-none-eabihf (the specific microcontroller) in --release mode +``` +cargo build --target thumbv7em-none-eabihf --release +``` + +openocd.sh +- Runs the code on the target +``` +openocd -f interface/stlink-v2-1.cfg -f target/stm32f4x.cfg +``` + +gdb.sh +- Runs gdb and connects to the target's code +``` +TARGET=thumbv7em-none-eabihf +arm-none-eabi-gdb target/$TARGET/release/app_a4 +``` + # Memory Safety Discussion First of all, we do use unsafe Rust code. This means that the safety of our static global variables is at risk! @@ -8,4 +45,25 @@ Because the compiler won't check unsafe code, this could potentially in a worst case lead to information leakage or perhaps physical damage to infrastructure or people, all depending on what the code is able to affect. +# Cycle Count + +We can see the comparisons of clock cycles required to perform various tasks in various modes, +Debug and Released. +After enabling the ```clock_cycle_count()``` in the Rust code, +we can find the DWT_CYCCNT register (clock cycle count) at memory address 0xe0001004, +which we read from to get the following values. +A breakpoint is set just as decoding is complete to prevent additional clock cycles affecting the result. + +### ABC +#### DEBUG +Cycles: 4730 + +#### RELEASE +Cycles: 350 + +### CODED +#### DEBUG +Cycles: 176506 +#### RELEASE +Cycles: 11614 diff --git a/compile.sh b/compile.sh index 18694f414f7a02dedf2f52e89258d77babcca5a9..c090680d9a2950aef69ed4182da641ddb0a7dda9 100755 --- a/compile.sh +++ b/compile.sh @@ -1,3 +1,4 @@ #!/bin/bash -cargo build --target thumbv7em-none-eabihf --release +#cargo build --target thumbv7em-none-eabihf --release +cargo build --target thumbv7em-none-eabihf diff --git a/gdb.sh b/gdb.sh index 9b57ea123eef5fa62795163929e8cce677bfe355..12365a714e92f420176694a883841f6c5db909cb 100755 --- a/gdb.sh +++ b/gdb.sh @@ -1,3 +1,4 @@ #!/bin/bash TARGET=thumbv7em-none-eabihf -arm-none-eabi-gdb target/$TARGET/release/app_a4 +#arm-none-eabi-gdb target/$TARGET/release/app_a4 +arm-none-eabi-gdb target/$TARGET/debug/app_a4 diff --git a/src/main.rs b/src/main.rs index 39f44aa236efa9ae469d1ea8fcb5d6904991ff37..b62762710f016d024d1072fab135bf86933dc9d4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,21 @@ #![no_std] #![feature(lang_items)] +extern crate cortex_m; extern crate cortex_m_semihosting; extern crate stm32f40x; use core::fmt::Write; +use cortex_m::asm; use cortex_m_semihosting::hio; +use stm32f40x::DWT; + //u8 plain[132]; static mut PLAIN: [u8; 132] = [0; 132]; //abc -//static ABC: [u32; 4] = [0x9fdd9158, 0x85715808, 0xac73323a, 0]; +static ABC: [u32; 4] = [0x9fdd9158, 0x85715808, 0xac73323a, 0]; static CODED: [u32; 132] = [0x015e7a47, 0x2ef84ebb, 0x177a8db4, 0x1b722ff9, 0x5dc7cff0, 0x5dc9dea6, 0x1da0c15a, 0xe4c236a2, 0x3d16b0d0, 0x1f397842, 0xaae0d2ba, 0x11246674, 0x0845317f, 0xd5512dad, 0xb6184977, 0xd293a53e, 0x7d9c2716, 0xd917eae6, 0xd8852384, @@ -38,7 +42,6 @@ static mut SEED: u32 = 0x0e0657c1; - fn codgen(seed: &mut u32) -> u32{ let n: u32 = seed.count_zeros(); // built-in count zeroes in n let x: u32 = seed.rotate_left(30); // rorate left by 30 bits @@ -72,28 +75,33 @@ fn decode(wordarr: &[u32], bytearr: &mut [u8], mut seed: &mut u32) -> u32{ } fn main() { - let mut stdout = hio::hstdout().unwrap(); - - unsafe { - let a: u32 = codgen(&mut TEST_SEED); - let b: u32 = codgen(&mut TEST_SEED); - let c: u32 = codgen(&mut TEST_SEED); - //println!("\nOutput Codgen:"); - //println!("{:x}", a); - //println!("{:x}", b); - //println!("{:x}", c); - - //writeln!(stdout, "0x{:x}", a).unwrap(); - //writeln!(stdout, "{:x}", b).unwrap(); - //writeln!(stdout, "{:x}", c).unwrap(); + unsafe { + (*DWT.get()).enable_cycle_counter(); + (*DWT.get()).cyccnt.write(0); } + let mut stdout = hio::hstdout().unwrap(); + unsafe { decode(&CODED[..], &mut PLAIN[..], &mut SEED); - //println!("\nComplete Output: {}", std::str::from_utf8(&PLAIN[..]).unwrap()); + //decode(&ABC[..], &mut PLAIN[..], &mut SEED); + + // We check cycles at this point + asm::bkpt(); + writeln!(stdout, "\nComplete Output: {}", core::str::from_utf8(&PLAIN[..]).unwrap()); } - + + // How am I supposed to use this? + //let y: u32 = DWT.get().get_cycle_count(); + //let x: u32 = DWT::get_cycle_count(); + //writeln!(stdout, "This is it: {:?}", x); + + + //DWT_CYCCNT @ 0xE0001004 is the Cycle Count Register, type: RW + //writeln!(stdout, "This is it: {}", n); + + loop {} }