{"id":13458885,"url":"https://github.com/firmadyne/firmadyne","last_synced_at":"2025-05-15T06:05:46.821Z","repository":{"id":37735671,"uuid":"51781408","full_name":"firmadyne/firmadyne","owner":"firmadyne","description":"Platform for emulation and dynamic analysis of Linux-based firmware","archived":false,"fork":false,"pushed_at":"2024-07-21T00:21:54.000Z","size":421,"stargazers_count":1910,"open_issues_count":104,"forks_count":352,"subscribers_count":73,"default_branch":"master","last_synced_at":"2025-04-11T15:57:09.426Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/firmadyne.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-02-15T19:56:48.000Z","updated_at":"2025-04-09T01:39:00.000Z","dependencies_parsed_at":"2024-01-07T13:04:30.648Z","dependency_job_id":"9330ef41-8465-4a1f-94a9-3d3bd33c2683","html_url":"https://github.com/firmadyne/firmadyne","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/firmadyne%2Ffirmadyne","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/firmadyne%2Ffirmadyne/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/firmadyne%2Ffirmadyne/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/firmadyne%2Ffirmadyne/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/firmadyne","download_url":"https://codeload.github.com/firmadyne/firmadyne/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254283339,"owners_count":22045140,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T09:00:59.323Z","updated_at":"2025-05-15T06:05:46.761Z","avatar_url":"https://github.com/firmadyne.png","language":"Shell","funding_links":[],"categories":["Tool","Shell","Emulation and Fuzzing","Tools","Software Tools","📚 Table of Contents","Firmware Security","Programming/Comp Sci/SE Things","Testing Tools"],"sub_categories":["Firmware Emulation","Open Source","Emulation Tools","Firmware Analysis \u0026 Extraction","Dynamic Analysis and Emulation","Analysis Tools","Lifting and Reversing Firmware","Firmware Analysis and Exploit Frameworks"],"readme":"# Table of Contents\n\n- [Table of Contents](#table-of-contents)\n- [Introduction](#introduction)\n- [Setup](#setup)\n  - [Extractor](#extractor)\n  - [Database](#database)\n  - [Binaries](#binaries)\n  - [QEMU](#qemu)\n- [Usage](#usage)\n- [FAQ](#faq)\n  - [run.sh is not generated](#runsh-is-not-generated)\n  - [Log ends with \"Kernel panic - not syncing: No working init found\"](#log-ends-with-kernel-panic---not-syncing-no-working-init-found)\n  - [A process crashed, e.g. do_page_fault() #2: sending SIGSEGV for invalid read access from 00000000](#a-process-crashed-eg-do_page_fault-2-sending-sigsegv-for-invalid-read-access-from-00000000)\n  - [How do I debug the emulated firmware?](#how-do-i-debug-the-emulated-firmware)\n- [Compiling from Source](#compiling-from-source)\n  - [Toolchain](#toolchain)\n  - [console](#console)\n  - [libnvram](#libnvram)\n  - [Kernel](#kernel)\n    - [ARM](#arm)\n    - [MIPS](#mips)\n- [Database](#database-1)\n  - [Data](#data)\n  - [Schema](#schema)\n- [Paper](#paper)\n\n# Introduction\n\nFIRMADYNE is an automated and scalable system for performing emulation and\ndynamic analysis of Linux-based embedded firmware. It includes the following\ncomponents:\n\n* modified kernels (MIPS: [v2.6](https://github.com/firmadyne/kernel-v2.6),\nARM: [v4.1](https://github.com/firmadyne/kernel-v4.1),\n[v3.10](https://github.com/firmadyne/kernel-v3.10)) for instrumentation of\nfirmware execution;\n* a userspace [NVRAM library](https://github.com/firmadyne/libnvram) to emulate\na hardware NVRAM peripheral;\n* an [extractor](https://github.com/firmadyne/extractor) to extract a\nfilesystem and kernel from downloaded firmware;\n* a small [console](https://github.com/firmadyne/console) application to spawn\nan additional shell for debugging;\n* and a [scraper](https://github.com/firmadyne/scraper) to download firmware from\n42+ different vendors.\n\nWe have also written the following three basic automated analyses\nusing the FIRMADYNE system.\n\n* Accessible Webpages: This script iterates through each file\nwithin the filesystem of a firmware image that appears to be served by a\nwebserver, and aggregates the results based on whether they appear to required\nauthentication.\n* SNMP Information: This script dumps the contents of the\n`public` and `private` SNMP v2c communities to disk using no credentials.\n* Vulnerability Check: This script tests for the presence\nof 60 known vulnerabilities using exploits from Metasploit. In addition, it\nalso checks for 14 previously-unknown vulnerabilities that we discovered.\nFor more information, including affected products and CVE's, refer to\n[analyses/README.md](https://github.com/firmadyne/firmadyne/blob/master/analyses/README.md).\n\nIn our 2016 [Network and Distributed System Security Symposium (NDSS)](http://www.internetsociety.org/events/ndss-symposium)\npaper, titled [Towards Automated Dynamic Analysis for Linux-based Embedded Firmware](https://github.com/firmadyne/firmadyne/blob/master/paper/paper.pdf), we evaluated the FIRMADYNE\nsystem over a dataset of 23,035 firmware images, of which we were able to\nextract 9,486. Using 60 exploits from the [Metasploit Framework](https://github.com/rapid7/metasploit-framework),\nand 14 previously-unknown vulnerabilities that we discovered, we showed that\n846 out of 1,971 (43%) firmware images were vulnerable to at least one exploit,\nwhich we estimate to affect 89+ different products. For more details, refer to\nour paper linked above.\n\n**Note**: This project is a research tool, and is currently not production ready.\nIn particular, some components are quite immature and rough. We suggest\nrunning the system within a virtual machine. No support is offered, but pull\nrequests are greatly appreciated, whether for documentation, tests, or code!\n\n# Setup\n\nFirst, clone this repository recursively and install its dependencies.\n\n1. `sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan`\n2. `git clone --recursive https://github.com/firmadyne/firmadyne.git`\n\n## Extractor\n\nThe extractor depends on the [binwalk](https://github.com/ReFirmLabs/binwalk)\ntool, so we need to install that and its dependencies.\n\n1. `git clone https://github.com/ReFirmLabs/binwalk.git`\n2. `cd binwalk`\n2. `sudo ./deps.sh`\n3. `sudo python ./setup.py install`\n  * For Python 2.x, `sudo apt-get install python-lzma`\n4. `sudo -H pip install git+https://github.com/ahupp/python-magic`\n5. `sudo -H pip install git+https://github.com/sviehb/jefferson`.\n6. Optionally, instead of [upstream sasquatch](https://github.com/devttys0/sasquatch),\nour [sasquatch fork](https://github.com/firmadyne/sasquatch) can be used to\nprevent false positives by making errors fatal.\n\n## Database\n\nNext, install, set up, and configure the database.\n\n1. `sudo apt-get install postgresql`\n2. `sudo -u postgres createuser -P firmadyne`, with password `firmadyne`\n3. `sudo -u postgres createdb -O firmadyne firmware`\n4. `sudo -u postgres psql -d firmware \u003c ./firmadyne/database/schema`\n\n## Binaries\n\nTo download our pre-built binaries for all components, run the following script:\n\n* `cd ./firmadyne; ./download.sh`\n\nAlternatively, refer to the instructions [below](#compiling-from-source) to compile from source.\n\n## QEMU\n\nTo use [QEMU](http://wiki.qemu.org/Main_Page) provided by your distribution:\n\n* `sudo apt-get install qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils`\n\nNote that emulation of x86-based firmware is not currently supported, but installing\n`qemu-system-x86` resolves a packaging issue on certain Debian-based distributions.\n\nAlternatively, use our [modified version](https://github.com/firmadyne/qemu-linaro)\nof [qemu-linaro](https://git.linaro.org/?p=qemu/qemu-linaro.git) for certain\nfirmware with an `alphafs` webserver that assumes a fixed memory mapping (not\nrecommended), or [upstream qemu](https://github.com/qemu/qemu).\n\n# Usage\n\n1. Set `FIRMWARE_DIR` in `firmadyne.config` to point to the root of this repository.\n2. Download a firmware image, e.g. [v2.0.3](http://www.downloads.netgear.com/files/GDC/WNAP320/WNAP320%20Firmware%20Version%202.0.3.zip) for [Netgear WNAP320](https://www.netgear.com/support/product/WNAP320.aspx).\n   * `wget http://www.downloads.netgear.com/files/GDC/WNAP320/WNAP320%20Firmware%20Version%202.0.3.zip`\n3. Use the extractor to recover only the filesystem, no kernel (`-nk`), no parallel operation (`-np`), populating the `image` table in the SQL server at `127.0.0.1` (`-sql`) with the `Netgear` brand (`-b`), and storing the tarball in `images`.\n   * `./sources/extractor/extractor.py -b Netgear -sql 127.0.0.1 -np -nk \"WNAP320 Firmware Version 2.0.3.zip\" images`\n4. Identify the architecture of firmware `1` and store the result in the `image` table of the database.\n   * `./scripts/getArch.sh ./images/1.tar.gz`\n5. Load the contents of the filesystem for firmware `1` into the database, populating the `object` and `object_to_image` tables.\n   * `./scripts/tar2db.py -i 1 -f ./images/1.tar.gz`\n6. Create the QEMU disk image for firmware `1`.\n   * `sudo ./scripts/makeImage.sh 1`\n7. Infer the network configuration for firmware `1`. Kernel messages are logged to `./scratch/1/qemu.initial.serial.log`.\n   * `./scripts/inferNetwork.sh 1`\n8. Emulate firmware `1` with the inferred network configuration. This will modify the configuration of the host system by creating a TAP device and adding a route.\n   * `./scratch/1/run.sh`\n9. The system should be available over the network, and is ready for analysis. Kernel messages are mirrored to `./scratch/1/qemu.final.serial.log`. The filesystem for firmware `1` can be mounted to and unmounted from `scratch/1/image` with `./scripts/mount.sh 1` and `./scripts/umount.sh 1`.\n   * `./analyses/snmpwalk.sh 192.168.0.100`\n   * `./analyses/webAccess.py 1 192.168.0.100 log.txt`\n   * `mkdir exploits; ./analyses/runExploits.py -t 192.168.0.100 -o exploits/exploit -e x` (requires Metasploit Framework)\n   * `sudo nmap -O -sV 192.168.0.100`\n10. The default console should be automatically connected to the terminal. You may also login with `root` and `password`. Note that `Ctrl-c` is sent to the guest; use the QEMU monitor command `Ctrl-a + x` to terminate emulation.\n\n# FAQ\n## `run.sh` is not generated\nThis is a common error that is encountered when the network configuration is unable to be inferred. Follow the checklist below to figure out the cause.\n\n1. `inferNetwork.sh`: Did this script find any network interfaces (e.g. `Interfaces: [br0, 192.168.0.1]`)? If so, this is a bug; please report it. Otherwise, continue below.\n2. `qemu.initial.serial.log`: Does this file end with `Unable to mount root fs on unknown-block(8,1)`? If so, the initial filesystem image was not generated correctly using `kpartx`. Try deleting the scratch directory corresponding to this firmware image, and restart at `makeImage.sh`. Otherwise, the initial emulation didn't produce any useful instrumentation. Try increasing the timeout in `inferNetwork.sh` from `60` to `120` and restarting at `inferNetwork.sh`.\n3. `qemu.initial.serial.log`: Did the `init` process crash, and is this preceded by a failed NVRAM operation (e.g. `nvram_get_buf: Unable to open key \u003cfoo\u003e`)? If so, see the FAQ entries below.\n\n## Log ends with \"Kernel panic - not syncing: No working init found\"\nThe firmware uses an initialization process with an unusual name. You'll need to manually inspect the filesystem to identify the correct one, then modify the script to specify its full path by appending a kernel boot parameter `init=\u003cpath\u003e` to QEMU.\n\n## A process crashed, e.g. `do_page_fault() #2: sending SIGSEGV for invalid read access from 00000000`\nIt is likely that the process requested a NVRAM entry that FIRMADYNE does not have a default value for. This can be fixed by manually adding a source for NVRAM entries to `NVRAM_DEFAULTS_PATH`, an entry to `NVRAM_DEFAULTS`, or a file to `OVERRIDE_POINT` in `libnvram`. For more details, see the [documentation for libnvram](https://github.com/firmadyne/libnvram). Note that the first two options involve modifying `config.h`, which will require recompilation of `libnvram`.\n\n## How do I debug the emulated firmware?\n1. With full-system QEMU emulation, compile a statically-linked `gdbserver` for the target architecture, copy it into the filesystem, attach it to the process of interest, and connect remotely using `gdb-multiarch`. You'll need a cross-compile toolchain; either use the `crossbuild-essential-*` packages supplied by Debian/Ubuntu, build it from scratch using e.g. `buildroot`, or look for GPL sources and/or pre-compiled binaries online. If you have IDA Pro, you can use IDA's pre-compiled debug servers (located in the `dbgsrv` subdirectory of the install), though they are not GDB-compatible.\n2. With full-system QEMU emulation, pass the `-s -S` parameters to QEMU and connect to the stub using `target remote localhost:1234` from `gdb-multiarch`. However, the debugger won't automatically know where kernel and userspace is in memory, so you may need to manually do `add-symbol-file` in `gdb` and break around `try_to_run_init_process()` in the kernel.\n2. With user-mode QEMU emulation, `chroot` into the firmware image (optional), set `LD_LIBRARY_PATH` to contain the FIRMADYNE libnvram, and pass both the `-L` parameter with the correct path to the firmware `/lib` directory, and the binary of interest to QEMU. This is easiest to debug, because you can attach directly to the process using `gdb-multiarch`, and interact directly with the process, but the system state may not be accurate since the host kernel is being used. It is also somewhat insecure, because the emulated firmware can access the host filesystem and interact with the host kernel.\n\n# Compiling from Source\n\nIf you would like to compile the entire FIRMADYNE system from scratch\nwithout using our pre-built binaries, please follow the steps below.\n\n## [Toolchain](https://github.com/GregorR/musl-cross)\n\nIn order to build any of the binaries used by FIRMADYNE, you will need three\ncross-compilation toolchains for the following architecture triples. Use only\n[musl libc](http://www.musl-libc.org) as the C runtime library for the\ntoolchain; others have not been tested.\n\n* arm-linux-musleabi\n* mipseb-linux-musl\n* mipsel-linux-musl\n\nTo simplify the process of building cross-compilation toolchains with musl, we\nrecommend using the [musl-cross](https://github.com/GregorR/musl-cross) project.\nFollow the below steps to build these toolchains from source, or alternatively\nclick [here](https://zenodo.org/record/4922202) to\ndownload our pre-built toolchains.\n\n1. `git clone https://github.com/GregorR/musl-cross.git`\n\n2. Modify or set the following variables in `defs.sh`\n   * `BINUTILS_URL=http://ftp.gnu.org/gnu/binutils/binutils-2.25.1.tar.bz2`\n   * `GCC_VERSION=5.3.0`\n   * `GMP_VERSION=6.0.0a`\n   * `MPC_VERSION=1.0.2`\n   * `MPFR_VERSION=3.1.3`\n   * `LIBELF_VERSION=master`\n   * `MUSL_DEFAULT_VERSION=1.1.12`\n   * `MUSL_GIT_VERSION=615629bd6fcd6ddb69ad762e679f088c7bd878e2`\n   * `LANG_CXX=no`\n   * `GCC_BUILTIN_PREREQS=yes`\n\n3. Modify or set the following variables in `config.sh`\n   * `CFLAGS=\"-fPIC\"`\n\n4. For little-endian MIPS, perform the following:\n   * set `TRIPLE=mipsel-linux-musl` in `config.sh`\n   * set `LINUX_HEADERS_URL=https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.4.tar.xz` in `defs.sh`\n   * run `./clean.sh` to clean out any previous builds\n   * run `./build.sh` to build and install the toolchain into `/opt/cross`\n\n5. For big-endian MIPS, perform the following:\n   * set `TRIPLE=mipseb-linux-musl` in `config.sh`\n   * set `LINUX_HEADERS_URL=https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.4.tar.xz` in `defs.sh`\n   * run `./clean.sh` to clean out any previous builds\n   * run `./build.sh` to build and install the toolchain into `/opt/cross`\n\n6. For little-endian ARM, perform the following:\n   * set `TRIPLE=arm-linux-musleabi`, `GCC_BOOTSTRAP_CONFFLAGS=\"--with-arch=armv6 --with-float=softfp\"`, and `GCC_CONFFLAGS=\"--with-arch=armv6 --with-float=softfp\"` in `config.sh`\n   * set `LINUX_HEADERS_URL=https://kernel.org/pub/linux/kernel/v4.x/linux-4.1.17.tar.xz` in `defs.sh`\n   * run `./clean.sh` to clean out any previous builds\n   * run `./build.sh` to build and install the toolchain into `/opt/cross`\n\n7. You should have the following directories, or wherever you installed the toolchains:\n   * `/opt/cross/arm-linux-musleabi`\n   * `/opt/cross/mipseb-linux-musl`\n   * `/opt/cross/mipsel-linux-musl`\n\n## [console](https://github.com/firmadyne/console)\n\n1. `cd ./firmadyne/sources/console`\n2. `make clean \u0026\u0026 CC=/opt/cross/arm-linux-musleabi/bin/arm-linux-musleabi-gcc make \u0026\u0026 mv console ../../binaries/console.armel`\n3. `make clean \u0026\u0026 CC=/opt/cross/mipseb-linux-musl/bin/mipseb-linux-musl-gcc make \u0026\u0026 mv console ../../binaries/console.mipseb`\n4. `make clean \u0026\u0026 CC=/opt/cross/mipsel-linux-musl/bin/mipsel-linux-musl-gcc make \u0026\u0026 mv console ../../binaries/console.mipsel`\n\n## [libnvram](https://github.com/firmadyne/libnvram)\n\n1. `cd ./firmadyne/sources/libnvram`\n2. `make clean \u0026\u0026 CC=/opt/cross/arm-linux-musleabi/bin/arm-linux-musleabi-gcc make \u0026\u0026 mv libnvram.so ../../binaries/libnvram.so.armel`\n3. `make clean \u0026\u0026 CC=/opt/cross/mipseb-linux-musl/bin/mipseb-linux-musl-gcc make \u0026\u0026 mv libnvram.so ../../binaries/libnvram.so.mipseb`\n4. `make clean \u0026\u0026 CC=/opt/cross/mipsel-linux-musl/bin/mipsel-linux-musl-gcc make \u0026\u0026 mv libnvram.so ../../binaries/libnvram.so.mipsel`\n\n## Kernel\n\n### [ARM](https://github.com/firmadyne/kernel-v4.1)\n\n1. `git clone https://github.com/firmadyne/kernel-v4.1.git \u0026\u0026 cd kernel-v4.1`\n2. `mkdir -p build/armel`\n3. `cp config.armel build/armel/.config`\n4. `make ARCH=arm CROSS_COMPILE=/opt/cross/arm-linux-musleabi/bin/arm-linux-musleabi- O=./build/armel zImage -j8`\n5. `cp build/armel/arch/arm/boot/zImage ../firmadyne/binaries/zImage.armel`\n\n### [MIPS](https://github.com/firmadyne/kernel-v2.6)\n\n1. `git clone https://github.com/firmadyne/kernel-v2.6.git \u0026\u0026 cd kernel-v2.6`\n2. For big-endian MIPS, perform the following:\n    1. `mkdir -p build/mipseb`\n    2. `cp config.mipseb build/mipseb/.config`\n    3. `make ARCH=mips CROSS_COMPILE=/opt/cross/mipseb-linux-musl/bin/mipseb-linux-musl- O=./build/mipseb -j8`\n    4. `cp build/mipseb/vmlinux ../firmadyne/binaries/vmlinux.mipseb`\n\n3. For little-endian MIPS, perform the following:\n    1. `mkdir -p build/mipsel`\n    2. `cp config.mipsel build/mipsel/.config`\n    3. `make ARCH=mips CROSS_COMPILE=/opt/cross/mipsel-linux-musl/bin/mipsel-linux-musl- O=./build/mipsel -j8`\n    4. `cp build/mipsel/vmlinux ../firmadyne/binaries/vmlinux.mipsel`\n\n# Database\n\nDuring development, the database was stored on a PostgreSQL server.\n\n## Data\n\nAlthough we cannot redistribute binary firmware, the data used for our\nexperiments is available [here](https://zenodo.org/record/4922202).\n\n## [Schema](https://github.com/firmadyne/firmadyne/blob/master/database/schema)\n\nBelow are descriptions of tables in the schema.\n\n* `brand`: Stores brand names for each vendor.\n\n| Column | Description |\n| ------ | ----------- |\n| id     | Primary key |\n| name   | Brand name  |\n\n* `image`: Stores information about each firmware image.\n\n| Column           | Description                                  |\n| ---------------- | -------------------------------------------- |\n| id               | Primary key                                  |\n| filename         | File name                                    |\n| brand_id         | Foreign key to `brand`                       |\n| hash             | MD5                                          |\n| rootfs_extracted | Whether the primary filesystem was extracted |\n| kernel_extracted | Whether the kernel was extracted             |\n| arch             | Hardware architecture                        |\n| kernel_version   | Version of the extracted kernel              |\n\n* `object`: Stores information about each file in a filesystem.\n\n| Column           | Description            |\n| ---------------- | ---------------------- |\n| id               | Primary key            |\n| hash             | MD5                    |\n\n* `object_to_image`: Maps unique files to their firmware images.\n\n| Column           | Description                 |\n| ---------------- | --------------------------- |\n| id               | Primary key                 |\n| oid              | Foreign key to `object`     |\n| iid              | Foreign key to `image`      |\n| filename         | Full path to the file       |\n| regular_file     | Whether the file is regular |\n| permissions      | File permissions in octal   |\n| uid              | Owner's user ID             |\n| gid              | Group's group ID            |\n\n* `product`\n\n| Column       | Description                    |\n| ------------ | ------------------------------ |\n| id           | Primary key                    |\n| iid          | Foreign key to `image`         |\n| url          | Download URL                   |\n| mib_filename | Filename of the SNMP MIB       |\n| mib_hash     | MD5 of the SNP MIB             |\n| mib_url      | Download URL of the SNMP MIB   |\n| sdk_filename | Filename of the source SDK     |\n| sdk_hash     | MD5 of the source SDK          |\n| sdk_url      | Download URL of the source SDK |\n| product      | Product name                   |\n| version      | Version string                 |\n| build        | Build string                   |\n| date         | Release date                   |\n\n# Paper\n\nThe results discussed in our [paper](https://github.com/firmadyne/firmadyne/blob/master/paper/paper.pdf) were produced using pre-release versions of the following:\n\n* toolchains:\n   * `BINUTILS_URL=http://ftp.gnu.org/gnu/binutils/binutils-2.25.1.tar.bz2`, `GCC_VERSION=4.9.3`, `GMP_VERSION=6.0.0a`, `MPC_VERSION=1.0.2`, `MPFR_VERSION=3.1.3`, `LIBELF_VERSION=71bf774909fd654d8167a475333fa8f37fbbcb5d`, `MUSL_DEFAULT_VERSION=1.1.10`, `MUSL_GIT_VERSION=996d148bf14b477b07fa3691bffeb930c67b2b62`, `LANG_CXX=no`\n   * ARM: `LINUX_HEADERS_URL=https://kernel.org/pub/linux/kernel/v3.x/linux-3.10.84.tar.xz`\n   * MIPS: `LINUX_HEADERS_URL=https://kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.32/linux-2.6.32.67.tar.xz`\n* kernels:\n   * ARM: [firmadyne-v3.10.92](https://github.com/firmadyne/kernel-v3.10/tree/firmadyne-v3.10.92)\n   * MIPS: [firmadyne-v2.6.32.68](https://github.com/firmadyne/kernel-v2.6.32/tree/firmadyne-v2.6.32.68) without `e2b9f315547ea50a65baad4899a4780078ab273e` and `26bb3636c987fc7e145af73ddea6c10fa93bdae9`\n* console: [`c36ae8553fa4e9c82e8a65752906641d81c2360c`](https://github.com/firmadyne/console/commits/c36ae8553fa4e9c82e8a65752906641d81c2360c)\n* extractor: [`5520c64bfa8554c5c17ab671aaed0fdeec91bf19`](https://github.com/firmadyne/extractor/commits/5520c64bfa8554c5c17ab671aaed0fdeec91bf19)\n* libnvram: [`b60e7d4d576b39dd46107058adb635d43e80e00d`](https://github.com/firmadyne/libnvram/commits/b60e7d4d576b39dd46107058adb635d43e80e00d)\n* qemu-linaro: [`4753f5e8126a00cc0a8559bfd9b47d6340903323`](https://github.com/firmadyne/qemu-linaro/commits/4753f5e8126a00cc0a8559bfd9b47d6340903323)\n* binwalk: [`f2ce2992695fae5477c46980148c89e9c91a5cce`](https://github.com/ReFirmLabs/binwalk/commits/f2ce2992695fae5477c46980148c89e9c91a5cce)\n   * jefferson: [`090a33be0be4aac8eee8d825447c0eb18dc8b51a`](https://github.com/firmadyne/jefferson/commits/090a33be0be4aac8eee8d825447c0eb18dc8b51a)\n   * sasquatch: [`287e4a8e059d3ee7a5f643211fcf00c292cd6f4d`](https://github.com/firmadyne/sasquatch/commits/287e4a8e059d3ee7a5f643211fcf00c292cd6f4d)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffirmadyne%2Ffirmadyne","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffirmadyne%2Ffirmadyne","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffirmadyne%2Ffirmadyne/lists"}