x86reducer

Crates.iox86reducer
lib.rsx86reducer
version0.1.0
sourcesrc
created_at2022-05-14 18:21:26.426601
updated_at2022-05-14 18:21:26.426601
descriptiona rudimentary x86 disassembler in Rust, for JHU's REVA class
homepage
repository
max_upload_size
id586736
size148,347
Friday Ortiz (FridayOrtiz)

documentation

README

x86reducer

A Rust program for disassembling raw x86 assembly, written for JHU's Reverse Engineering and Vulnerability Analysis course.

Disassembly Mode

The primary mode, returns the disassembled output of a target binary. Note that the binary must only contain x86 assembly instructions, with the code beginning at offset 0.

❯ printf >tmp.asm "[BITS 32]\n\nstart:\n\txchg eax, eax\n"
❯ nasm tmp.asm
❯ cargo run -- -i tmp
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/reducer -i tmp`
0x00000000:     90                      nop 

Byte Decoding Mode

You can also manually specify a MODR/M byte or MODR/M byte plus SIB byte, and reducer will decode it for you.

❯ cargo run -- --modrm 4d --sib 00
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/reducer --modrm 4d --sib 00`
Decoding: 4D
ModRM { md: RmByte, reg: ECX, rm: EBP }
Decoding: 00
SIB { scale: None, index: EAX, base: EAX }

Known Issues in Disassembly Mode

There are several known issues which are entirely cosmetic.

  • Signed bytes will sometimes be output as sign extended DWORDs.
  • Unsigned bytes will sometimes be output as DWORDs.
  • Instructions will be generated with ghost entries. For example, reducer will output call [ + esp + 0x00000033 ] instead of call [esp + 0x33].
  • SIB bytes scaled by esp will not render correctly. E.g., they include a "blank" esp followed by the scale, such as [*2 0x11223344].

There is one known issue which is not entirely cosmetic.

  • Bad inputs are handled by throwing and catching panics. This is hacky and terrible.
Commit count: 0

cargo fmt