Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2024-56426 — CVE-2024-56426 Exynos9830 Bootrom Exploit - SM-G985F | Kitploit
Tools/GitHubGitHub/xcracker000/cve-2024-56426
Android SecurityEmbedded Systems SecurityExploitationReverse EngineeringHardware HackingMobile SecurityHardware SecurityPayload DevelopmentFirmware AnalysisBinary Exploitation
GitHubxcracker000/cve-2024-56426
3725 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2024-56426

CVE-2024-56426 Exynos9830 Bootrom Exploit - SM-G985F

View Repository

SM-G985F / Exynos9830 Bootrom exploit

[!CAUTION] The current key bundle and generated files are fusing-capable. Once a device has been fused, the eFuse change is irreversible and the device must continue to use boot images and key material that match the fused key. Using these files or flows is at your own risk because of the fusing behavior; all consequences remain the responsibility of the user running them. Verify the eFuse file, private keys, signed FWBL1, LK / sboot.bin images, and target device before running any fusing flow.

Contents

  • Repository Layout
  • Requirements
  • Image Preparation
  • Payload Build
  • Signed SBoot Image Generation
  • Exploit Modes
  • Exynos 9830 Boot Chain
  • Exynos 9830 Image Layout
  • Load Addresses
  • Boot Source IDs
  • Dump /mem Payload
  • Upstream Attribution
  • Credits

Repository Layout

PathPurpose
bootLoaderFiles/Bootloader binaries, split bootloader parts, original images, decrypted images, and dump artifacts.
bootromNotes/Boot ROM notes, flowcharts, and USB context offsets.
exploit/Python tooling, exploit runner, split/merge scripts, payload build helper, and SoC data.
exploit/extra/images/Working bootloader images consumed by the exploit flows.
exploit/extra/payloads/Built payload binaries copied from external/payloads/.
external/Payload sources, build Makefile, decompiled notes, shared key material, and helper tools.
external/keys/exynos9830_crecker/Shared Exynos9830 / Exynos990 custom-key bundle used by the signed-loader flow.
exynos990reverseEng/Exynos 990 reverse engineering project files.

Requirements

Linux Toolchain

root@kitploit:~
sudo apt-get update
sudo apt-get install -y gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu

macOS Toolchain

root@kitploit:~
brew tap messense/macos-cross-toolchains
brew install aarch64-unknown-linux-gnu

Python Dependencies

root@kitploit:~
python3 -m pip install -r requirements.txt

requirements.txt includes coloredlogs, cryptography, hexdump, libusb, pyusb, and pycryptodome.

Windows USB Driver

On Windows, the BootROM USB device 04e8:1234 must use a WinUSB/libusb-compatible driver before PyUSB can open it. See exploit/windows/README.md.

The repository includes a WinUSB driver package at exploit/windows/Exynos_USB_Device.inf, with its matching catalog and certificate import file in the same directory.

Image Preparation

Split sboot.bin

root@kitploit:~
python3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images

The split script writes image parts and a split_manifest.json file into the output directory.

Patch LK Custom Key

The LK image must use the ROM secure boot key 2 command IDs for the custom-key flow:

When applying the LK patch TSV inside the Ghidra project, the helper was called through Ghidra headless like this:

root@kitploit:~
GHIDRA=/path/to/ghidra_12.0.4_PUBLIC
REPO=$(pwd)
"$GHIDRA/support/analyzeHeadless" "$REPO/exynos990reverseEng" exynos990 \
  -process lk.bin \
  -noanalysis \
  -scriptPath "$REPO/external/ghidra" \
  -postScript ApplyLkPatches.java "$REPO/external/ghidra/lk_985_selected_patches.tsv"

Embed the 32-byte eFuse key into lk.bin at offset 0x205008, replacing the stock key:

root@kitploit:~
dd if=external/keys/exynos9830_crecker/crecker.efuse of=exploit/extra/images/lk.bin bs=1 seek=$((0x205008)) count=32 conv=notrunc
xxd -g1 -s $((0x205008)) -l 32 exploit/extra/images/lk.bin

Merge Split Parts

root@kitploit:~
python3 exploit/merge.py exploit/extra/images Exynos9830

The merge script writes sboot.bin in the current working directory.

Payload Build

Build the payload projects under external/payloads/ and copy the resulting binaries into exploit/extra/payloads/:

root@kitploit:~
./exploit/build_payloads.sh

The UFS loader and custom-key payload embed a 32-byte efuse file at build time. By default the Makefile reads external/keys/exynos9830_crecker/crecker.efuse; override this with CUSTOM_KEY_EFUSE=/path/to/crecker.efuse when needed.

Signed SBoot Image Generation

The preflight step run by exploit/exploit.py re-signs the SBoot image set in exploit/extra/images/ in place before each signed run. No separate signed output is kept. The signing step uses the intentionally tracked shared key bundle under external/keys/exynos9830_crecker/.

Equivalent repo-root command for the complete image set:

root@kitploit:~
python3 external/tools/sign_sboot_images.py \
  --images-dir exploit/extra/images \
  --keys-dir external/keys/exynos9830_crecker

This signs:

The batch signer passes decimal 23 for every image and does not reuse an older rollback value already present in an existing footer.

epbl.img is re-encrypted first when needed, then signed over the final bytes. ldfw.img and tzsw.img still need the external AVB flow if their AVB content is meant to be refreshed.

The FWBL1-only command is:

root@kitploit:~
python3 external/tools/sign_tool.py \
  -i exploit/extra/images/fwbl1.img \
  -o exploit/extra/images/fwbl1.img \
  -k external/keys/exynos9830_crecker/crecker_private.pem \
  -H external/keys/exynos9830_crecker/crecker.hmac \
  -s 0x3000 \
  -r 23 \
  -ma 0x9830 \
  -m 0x142 \
  -e 11 \
  -t external/keys/exynos9830_crecker/crecker_stage2_tee_pubkey.bin \
  -re external/keys/exynos9830_crecker/crecker_stage2_ree_pubkey.bin

Short form when sign_tool.py, fwbl1.img, and the crecker_* files are in the current directory:

root@kitploit:~
python3 sign_tool.py -i fwbl1.img -o fwbl1.img -k crecker_private.pem -H crecker.hmac -s 0x3000 -r 23 -ma 0x9830 -m 0x142 -e 11 -t crecker_stage2_tee_pubkey.bin -re crecker_stage2_ree_pubkey.bin

Exploit Modes

Run commands from the repository root unless noted otherwise.

Device Flow Notes

Exynos 9830 Boot Chain

The observed Exynos 9830 boot procedure is:

Exynos 9830 Image Layout

Load Addresses

Boot Source IDs

Raw Boot Source IDs

Boot Source Values

Dump /mem Payload

Note: The mem.bin dump payload can only be used when no working sboot is installed.

  1. Send uh.bin over Heimdall to the bootloader:

    root@kitploit:~
    heimdall flash --BOOTLOADER uh.bin
    
  2. Run the dump flow:

    root@kitploit:~
    python3 exploit/exploit.py --dump
    
  3. Review the generated exynos990.bootrom.bin dump.

Upstream Attribution

Portions of the Python recovery tooling in this repository were adapted from halal-beef/hubble.

That upstream project is published under the GNU GPL v2.0, and this repository keeps a GPL-2.0 license for compatibility. See LICENSE and NOTICE.md.

The Exynos990 custom-key payload under external/payloads/exynos990_boot_custom_key/ is based on the boot-custom-key payload skeleton and control-flow idea from VDavid003/exynos-usbdl, a fork of frederic/exynos-usbdl. It has been substantially rewritten and adapted for the Exynos9830 / Exynos990 GET_CONFIGURATION chain, and is not a verbatim copy of the upstream payload. Because the referenced upstream project is licensed under the GNU GPL v3.0, this payload is kept under GPL-3.0-only; see external/payloads/exynos990_boot_custom_key/LICENSE.

Credits

Download Tool
Key 1 commandValueKey 2 commandValue
CMD_W_ROM_SEC_BOOT_KEY10x001CMD_W_ROM_SEC_BOOT_KEY20x016
CMD_W_USE_ROM_SEC_BOOT_KEY10x002CMD_W_USE_ROM_SEC_BOOT_KEY20x017
CMD_C_ROM_SEC_BOOT_KEY10x100CMD_C_ROM_SEC_BOOT_KEY20x114
CMD_R_USE_ROM_SEC_BOOT_KEY10x101CMD_R_USE_ROM_SEC_BOOT_KEY20x115
PayloadOutput pathPurpose
mem.binexploit/extra/payloads/mem.binBoot ROM memory dump payload.
loader.binexploit/extra/payloads/loader.binUFS path payload used by --ufs.
Exynos990_boot_custom_key.binexploit/extra/payloads/Exynos990_boot_custom_key.binCustom-key signed-loader payload used by --signed.
ImageKey material usedRollback revision
fwbl1.imgBL1 private key + Stage2 TEE/REE pubkeys23
epbl.imgStage2 TEE private key23
bl2.imgStage2 REE private key23
lk.binStage2 REE private key23
el3_mon.imgStage2 TEE private key23
ldfw.imgStage2 TEE private key, inner + outer23
tzsw.imgStage2 TEE private key, inner + outer23
CommandModeDefault payloadNotes
python3 exploit/exploit.py --ufsUFS pathloader.binStarts the UFS payload flow.
python3 exploit/exploit.py --signedSigned Boot ChainExynos990_boot_custom_key.binRe-signs the SBoot image set, sends images.
python3 exploit/exploit.py --dumpBoot ROM dumpmem.binReceives 0x20000 bytes into exynos990.bootrom.bin.
StepNote
1Enter download mode.
2Create or update sboot.bin with exploit/merge.py when needed.
3Use the signed custom-key flow to reach Crecker mode, an ODIN-style mode that accepts the target image flow.
4Send the new sboot.bin through ODIN, Heimdall, or another compatible sender.
5Run the UFS payload.
6Optional: install CreckerRom for One UI 7 and Strong Integrity workflows.
7Optional: lock the bootloader after the target setup is complete.
StepStageNotes
1BootROMInitial ROM execution.
2BL1Full handoff from BootROM.
3EPBLFull handoff from BL1.
4EPBLSets up a minimal SMC handler.
5BL2EPBL loads BL2.
6BL2Partial handoff to BL2.
7LKBL2 uses EPBL to load LK, but LK does not immediately execute.
8EL3 MonitorBL2 uses EPBL to load EL3 Monitor.
9EL3 MonitorEPBL decrypts EL3 Monitor.
10EL3 MonitorFull handoff to EL3 Monitor.
11EL3 MonitorInitializes and sets up the extended SMC handler.
12LKExecution jumps to LK.
13LK / EL3 MonitorLK calls into the EL3 Monitor SMC handler to load TrustZone parts.
14ODIN / custom targetBoot continues to ODIN or the configured target.
PartStartEnd
fwbl1.img0x00x3000
epbl.img0x30000x16000
bl2.img0x160000x82000
lk.bin0xDB0000x35B000
el3_mon.img0x35B0000x39B000
StageLoad address
BL10x02022000
EPBL0x02026000
BL20x15600000
LK0xE8000000
EL3_MONITOR0xBFE80000
_boot_device source IDBoot source path
1UFS path, shared UFS load flow.
2eMMC/SDMMC init path, mmc_card_detect_and_init flow.
3SDMMC/MMC device 0, mmc_read_blocks(0, ...).
4USB load path.
5SDMMC/MMC device 1, mmc_read_blocks(1, ...).
6UFS alternate mode, same core UFS flow as 1 with a different mode flag.
7Non-MMC/UFS/USB raw controller read path.
0xB / 11USB fallback path, then same USB handler as 4.
Source IDValueMeaning
10x20UFS
20x14eMMC
30x00SDMMC_CH2
4 / 0xB0x40USB
CreditContribution
Chimera ToolFirst discovery of the exploit circa 2021-2022. Chimera provides advanced Exynos servicing capabilities across many devices, including capabilities based on this exploit.
CVE-2024-56426The CVE that this project is based on.
Christopher WadeReported CVE-2024-56426 to Samsung.
kethily-danielProvided access to the tool used for USB packet tracing and sample extraction.
BotchedRPRHelped with the initial research and creation of carte2.
VDavid003Helped reverse engineer the PoC through packet dumps and personally tested on devices.
halal-beef / hubbleProvided initial USB packet dumps and analysis of the PoC during the research lifecycle, backend code used by the exploit script, and SoC layouts used by the split and merge scripts.
VDavid003 / exynos-usbdlProvided the GPLv3 custom-key payload skeleton and Exynos USB download reference flow used as the basis for the Exynos990 custom-key payload.
R0rt1z2Helped with payload creation; some work was based on his project, kaeru.
AntiEngineerShared ARM knowledge, hints, and research support.
AAVulnerability inspiration and first use outside of Chimera.