## BinAbsInspector ![Language](https://img.shields.io/badge/Language-Java-blue) ![Author](https://img.shields.io/badge/Author-KeenSecurityLab-orange) ![GitHub stars](https://img.shields.io/github/stars/KeenSecurityLab/BinAbsInspector.svg?style=flat&logo=github) ![Version](https://img.shields.io/badge/Version-V0.1-red) ![Time](https://img.shields.io/badge/Join-20220615-green) # What is BinAbsInspector? BinAbsInspector (Binary Abstract Inspector) is a static analyzer for automated reverse engineering and scanning vulnerabilities in binaries, which is a long-term research project incubated at [Keenlab](https://keenlab.tencent.com/). It is based on abstract interpretation with the support from Ghidra. It works on Ghidra's Pcode instead of assembly. Currently it supports binaries on x86,x64, armv7 and aarch64. # Installation + Install Ghidra according to [Ghidra's documentation](https://github.com/NationalSecurityAgency/ghidra#install) + Install [Z3](https://github.com/Z3Prover/z3) (tested version: 4.8.15) + Note that generally there are two parts for Z3 library: one is Java package, the other one is native library. The Java package is already included in "/lib" directory, but we suggest that you replace it with your own Java package for version compatibility. + For Windows, download a pre-built package from [here](https://github.com/Z3Prover/z3/releases), extract the zip file and add a PATH environment variable pointing to `z3-${version}-win/bin` + For Linux, install with package manager is NOT recommended, there are two options: 1. You can download suitable pre-build package from [here](https://github.com/Z3Prover/z3/releases), extract the zip file and copy `z3-${version}-win/bin/*.so` to `/usr/local/lib/` 2. or you can build and install z3 according to [Building Z3 using make and GCC/Clang](https://github.com/Z3Prover/z3#building-z3-using-make-and-gccclang) + For MacOS, it is similar to Linux. + Download the extension zip file from [release page](https://github.com/KeenSecurityLab/BinAbsInspector/releases) + Install the extension according to [Ghidra Extension Notes](https://ghidra-sre.org/InstallationGuide.html#GhidraExtensionNotes) # Building Build the extension by yourself, if you want to develop a new feature, please refer to [development guide](https://github.com/KeenSecurityLab/BinAbsInspector/wiki/Developer-Guide). + Install Ghidra and Z3 + Install [Gradle 7.x](https://gradle.org/releases/) (tested version: 7.4) + Pull the repository + Run `gradle buildExtension` under repository root + The extension will be generated at `dist/${GhidraVersion}_${date}_BinAbsInspector.zip` # Usage You can run BinAbsInspector in headless mode, GUI mode, or with docker. + With Ghidra headless mode. ``` $GHIDRA_INSTALL_DIR/support/analyzeHeadless -import -postScript BinAbsInspector "@@" ``` `` -- Ghidra project path. `` -- Ghidra project name. `` -- The argument for our analyzer, provides following options: | Parameter | Description | | ----------------------------------------- | --------------------------------------| | `[-K ]` | KSet size limit [K](https://github.com/KeenSecurityLab/BinAbsInspector/wiki/Technical-Details#kset) | | `[-callStringK ]` | Call string maximum length [K](https://github.com/KeenSecurityLab/BinAbsInspector/wiki/Technical-Details#context)| | `[-Z3Timeout ]` | Z3 timeout | | `[-timeout ]` | Analysis timeout | | `[-entry
]` | Entry address | | `[-externalMap ]` | External function model config | | `[-json]` | Output in json format | | `[-disableZ3]` | Disable Z3 | | `[-all]` | Enable all checkers | | `[-debug]` | Enable debugging log output | | `[-check "[;...]"]` | Enable specific checkers | + With Ghidra GUI 1. Run Ghidra and import the target binary into a project 2. Analyze the binary with default settings 3. When the analysis is done, open `Window -> Script Manager` and find `BinAbsInspector.java` 4. Double-click on `BinAbsInspector.java` entry, set the parameters in configuration window and click OK 5. When the analysis is done, you can see the CWE reports in console window, double-click the addresses from the report can jump to corresponding address + With Docker ```shell git clone git@github.com:KeenSecurityLab/BinAbsInspector.git cd BinAbsInspector docker build . -t bai docker run -v $(pwd):/data/workspace bai "@@