From 1d49c6165b83d22cdad8192cc34afea7558cc909 Mon Sep 17 00:00:00 2001 From: Eljakim Herrewijnen Date: Sun, 12 Jan 2025 22:14:25 +0100 Subject: [PATCH] added rom header fuzzer --- source/bootrom_emulator/emulator.py | 50 +++++++++++++++++- .../fuzz_fastboot_input/getvar | Bin 0 -> 512 bytes .../fuzz_fastboot_input/getvar_chipinfo- | Bin 0 -> 512 bytes .../fuzz_fastboot_input/getvar_downloadsize | Bin 0 -> 512 bytes .../fuzz_fastboot_input/getvar_getchipinfo | Bin 0 -> 512 bytes .../fuzz_fastboot_input/getvar_serialno | Bin 0 -> 512 bytes .../fuzz_fastboot_input/getvar_version | Bin 0 -> 512 bytes .../fuzz_fastboot_input/setkey | Bin 0 -> 512 bytes .../fuzz_verifybl_input/fuzz_bl.bin | Bin 0 -> 64 bytes source/bootrom_emulator/fuzzer.py | 38 +++++++++++-- source/bootrom_emulator/run_fuzzer.sh | 1 + 11 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 source/bootrom_emulator/fuzz_fastboot_input/getvar create mode 100644 source/bootrom_emulator/fuzz_fastboot_input/getvar_chipinfo- create mode 100644 source/bootrom_emulator/fuzz_fastboot_input/getvar_downloadsize create mode 100644 source/bootrom_emulator/fuzz_fastboot_input/getvar_getchipinfo create mode 100644 source/bootrom_emulator/fuzz_fastboot_input/getvar_serialno create mode 100644 source/bootrom_emulator/fuzz_fastboot_input/getvar_version create mode 100644 source/bootrom_emulator/fuzz_fastboot_input/setkey create mode 100644 source/bootrom_emulator/fuzz_verifybl_input/fuzz_bl.bin diff --git a/source/bootrom_emulator/emulator.py b/source/bootrom_emulator/emulator.py index 253cf79..2460a6c 100644 --- a/source/bootrom_emulator/emulator.py +++ b/source/bootrom_emulator/emulator.py @@ -3,12 +3,15 @@ from unicorn.arm64_const import * from ghidra_assistant.utils.utils import * from ghidra_assistant.utils.archs.arm64.arm64_emulator import ARM64UC_Emulator from ghidra_assistant.utils.archs.arm64.asm_arm64 import ShellcodeCrafterARM64 -import sys, pathlib +import sys, pathlib, struct from add_memory_maps import * from tools import * from amlogic_devices import * from amlogic_rom_db import * +def p8(v): + return struct.pack("&&$bAOexN+N@W-YBPRp^XR8O- literal 0 HcmV?d00001 diff --git a/source/bootrom_emulator/fuzz_fastboot_input/getvar_getchipinfo b/source/bootrom_emulator/fuzz_fastboot_input/getvar_getchipinfo new file mode 100644 index 0000000000000000000000000000000000000000..ec4c8be6c85e7325fba9c00ef4724c940500d816 GIT binary patch literal 512 ecmYdKEh$SZvPw@aNzTYD$jnR2XBY(|C|7oP?p literal 0 HcmV?d00001 diff --git a/source/bootrom_emulator/fuzz_fastboot_input/getvar_version b/source/bootrom_emulator/fuzz_fastboot_input/getvar_version new file mode 100644 index 0000000000000000000000000000000000000000..35a93ee19d3887f92c82f0564c2e12d55be53afd GIT binary patch literal 512 acmYdKEh$SZvMNh0D$dN$V;BV^ECc{8^z~t&0000*0RbBT literal 0 HcmV?d00001 diff --git a/source/bootrom_emulator/fuzzer.py b/source/bootrom_emulator/fuzzer.py index 8091e03..441eef9 100644 --- a/source/bootrom_emulator/fuzzer.py +++ b/source/bootrom_emulator/fuzzer.py @@ -1,6 +1,6 @@ from emulator import * import unicornafl -import argparse +import argparse, os ENTRY_POINT = 0xffff0000 STACK_ADDRESS = 0xfffe3800 @@ -23,7 +23,7 @@ def test_fb_cmd(cmd=b'getvar:version', device="S905X3"): res = emulator.run_fastboot_cmd() pass -def afl_fuzzer(device="S905X3"): +def afl_fuzzer_fastboot(device="S905X3"): emulator = Amlogic_Emulator(device=device) # emulator.debug = True @@ -41,7 +41,29 @@ def afl_fuzzer(device="S905X3"): emulator.run_fastboot_cmd() return 0 - unicornafl.uc_afl_fuzz_custom(emulator.uc, "input/getvar", _place_fb_command, _run, persistent_iters=1) + unicornafl.uc_afl_fuzz_custom(emulator.uc, "fuzz_fastboot_input/getvar", _place_fb_command, _run, persistent_iters=1) + +def afl_fuzzer_verifybl(device="S905X3"): + emulator = Amlogic_Emulator(device=device) + # emulator.debug = True + + def place_bootloader_header(uc, input, persistent_round, data): + # hexdump(bytes(input), "input") + if len(input) != 0x40: + return False + # Filter some unsupported commands: + if input[:4] == b"@AML": + return False + emulator = Amlogic_Emulator(device=device) + emulator.place_bootloader(input) + return True + + def _run(uc, data): + emulator.run_check_bootloader_header() + return 0 + + unicornafl.uc_afl_fuzz_custom(emulator.uc, "fuzz_verifybl_input/fuzz_bl.bin", place_bootloader_header, _run, persistent_iters=1) + if __name__ == "__main__": # print(sys.argv) @@ -51,7 +73,6 @@ if __name__ == "__main__": # args.add_argument("--input", "-i", help="Input file for crash", default=None) # args = args.parse_args() - # if args.test: # test_fb_cmd(device=args.device) # print("", flush=True) @@ -63,4 +84,11 @@ if __name__ == "__main__": # else: # pass # Run AFL - afl_fuzzer() + + if os.getenv("AFL_FUZZER") == "verifybl": + afl_fuzzer_verifybl() + elif os.getenv("AFL_FUZZER") == "fastboot": + afl_fuzzer_fastboot() + else: + print("No AFL fuzzer selected") + exit(1) \ No newline at end of file diff --git a/source/bootrom_emulator/run_fuzzer.sh b/source/bootrom_emulator/run_fuzzer.sh index 756541c..0fef6fe 100755 --- a/source/bootrom_emulator/run_fuzzer.sh +++ b/source/bootrom_emulator/run_fuzzer.sh @@ -4,6 +4,7 @@ app_name="amlogic" target_soc="S922" inputs_dir="/fuzz/input/" outputs_dir="/fuzz/fuzz_output/${target_soc}" +export AFL_FUZZER="verifybl" # generate screenrc tmp_screen_rc="/tmp/screenrc.${app_name}"