projectbtle/argXtract

GitHub: projectbtle/argXtract

argXtract 是一款用于提取 ARM Cortex-M 设备二进制固件中 API 调用参数的工具。

Stars: 31 | Forks: 4

[快速链接到 Wiki](https://github.com/projectbtle/argXtract/wiki)
![argxtract_small](https://user-images.githubusercontent.com/29951305/103458078-9928f580-4cfc-11eb-8b3a-de2ed9bf490a.png)
## 什么是 `argXtract`? argXtract 是一个从剥离的物联网二进制文件(更具体地说,是 ARM Cortex-M 二进制文件)中提取 API 调用参数(SVC 调用和函数调用)的工具。 ## 为什么我想提取 API 调用的参数? 从安全角度来看,物联网设备的配置非常重要。许多物联网设备采用我们所说的 _分割固件_ 模型,其中技术堆栈(如蓝牙低功耗或 Thread)由供应商实现,开发者在上面构建应用程序。在这种情况下,大部分配置将通过供应商提供的 API 进行。例如,可能会提供 API 来定义访问权限、密码等。开发者也可能使用库来执行额外的配置。通过提取这些配置 API 的参数,我们可以了解设备的一些安全方面。 ## 如何使用 `argXtract`? 要从 API 调用中提取参数,您需要向 `argXtract` 提供API调用的详细信息。特别是,`argXtract` 需要知道如何在剥离的二进制文件中 _找到_ API 调用以及 API 调用的参数是如何 _格式化_ 的。对于前者,您需要提供 _函数模式文件_ 或关于监督调用的详细信息。对于后者,您需要定义 _参数定义文件_。我们提供了一些函数模式文件和参数定义文件以供开始使用。有关如何定义自己的文件,请访问我们的 [Wiki](https://github.com/projectbtle/argXtract/wiki). ``` usage: start.py [-h] (-d DIRECTORY | -f FILE | -l LIST) [-c [{c,e,w,i,d,t}]] [-b] [-t TIME_PER_TRACE] [-T TIME] -M [{s,f}] [-v VENDOR] [-p PROCESSES] [-F FUNCTIONS] [-a APP_CODE_BASE] [-m MAX_CALL_DEPTH] [-n [{n,l,s}]] arguments: -h, --help show this help message and exit -d DIRECTORY, --directory DIRECTORY directory containing firmware files to be analysed. Provide absolute path to directory as argument. -f FILE, --file FILE individual firmware file to be analysed. -l LIST, --list LIST text file containing absolute paths of firmware files to be analysed. -c [{c,e,w,i,d,t}], --console [{c,e,w,i,d,t}] console log level. One of c (critical), e (error), w (warning), i (info), d (debug), t (trace). -b, --bypass bypass all conditional checks. -t TIME_PER_TRACE, --time_per_trace TIME_PER_TRACE maximum trace time per file, per start point in seconds. -T TIME, --Time TIME maximum trace time per file in seconds. -M [{s,f}], --Mode [{s,f}] analysis mode. Either s (SVC) or f (function). -v VENDOR, --vendor VENDOR the vendor/chipset to test against. Vendor-specific files must be added to the repo. -p PROCESSES, --processes PROCESSES number of parallel processes ("threads") to use. -F FUNCTIONS, --Functions FUNCTIONS save function list to folder and exit. -a APP_CODE_BASE, --app_code_base APP_CODE_BASE address at which application should be loaded. -m MAX_CALL_DEPTH, --max_call_depth MAX_CALL_DEPTH maximum call depth of a function to be included in trace. -n [{n,l,s}], --null [{n,l,s}] mechanism for handling null values (mainly those in LDR). One of n (none - do nothing), l (loose - keep track when LDR attempts to load from outside RAM), s (strict - keep track when LDR attempts to load from any inaccessible memory location). Note that this tool has only been tested with Python 3.7+. It will not work with lower versions. ``` 因此,要分析单个 Nordic 蓝牙低功耗二进制文件,您将使用 `python start.py -f `。 [Wiki](https://github.com/projectbtle/argXtract/wiki) 中有关于每个标志的详细信息,以及如何在 `examples` 文件夹中运行各个示例的命令。 ### 我不明白。也许如果你给我一个例子? 考虑 Nordic 半导体提供的用于在蓝牙低功耗设备中配置选项的 `sd_ble_opt_set` API 调用。它启用的一个选项是设置固定的配对通行码。这可以通过以下 C 代码实现: ``` uint8_t passkey[] = "123456"; ble_opt_t ble_opt; ble_opt.gap_opt.passkey.p_passkey = &passkey[0]; err_code = sd_ble_opt_set(BLE_GAP_OPT_PASSKEY, &ble_opt); //BLE_GAP_OPT_PASSKEY = 34 ``` 根据目标芯片组,`sd_ble_opt_set` 对应于 `svc` 编号 `0x67` 或 `0x68`。我们向 `argXtract` 提供有关 `svc` 编号的详细信息,以便它可以识别在反汇编的 Nordic BLE 二进制文件中的 `sd_ble_opt_set` 调用。 如 C 代码所示,`sd_ble_opt_set` 接收两个参数:一个整数 `opt_id` 和一个指向指向通行码的指针。我们以下列格式定义此信息: ``` { "args": { "0": { "in_out": "in", "ptr_val": "value", "length": 4, "data": { "opt_id": { "ptr_val": "value", "length_bits": 32, "type": "uint32" } } }, "1": { "in_out": "in", "ptr_val": "pointer", "length": 6, "data": { "p_opt": { "ptr_val": "pointer", "length_bits": 48, "type": "hex" } } } } } ``` 这将产生以下输出: ``` "output": { "sd_ble_opt_set": [ { "opt_id": 34, "p_opt": "313233343536" } ] } ``` *注意:`0x313233343536` 是 "123456" 的十六进制表示,这是我们提供的固定通行码的字符串.* ## 需要更多信息? 请查看 [Wiki](https://github.com/projectbtle/argXtract/wiki)。它包含详细的如何操作指南,并详细解释了该工具的功能。我们的 [ACSAC '21 论文](https://dl.acm.org/doi/abs/10.1145/3485832.3488007) 解释了促使开发 argXtract 的问题,并记录了 argXtract 与其他流行逆向工程工具之间的比较。 ## 想要帮忙? 如果您恰好有带有标题的实时 Cortex-M 二进制文件(这样我们就可以获得准确的反汇编),并且您愿意与我们分享,请告诉我们。真实世界的数据是我们目前所缺乏的(到目前为止,我们正在使用不同的技术和编译器生成自己的测试文件,但真实世界的例子会好得多)。请注意,您必须有权分享这些二进制文件! 我们还希望加快我们的函数模式匹配模块。如果您有任何想法,请与我们联系!
标签:API安全, API调用分析, ARM架构, JSON输出, SOC Prime, 二进制分析, 云安全运维, 云资产清单, 供应商API, 参数提取, 反取证, 固件分析, 威胁情报, 安全测试, 安全评估, 安全配置, 安全防护, 开发工具, 开发者工具, 技术栈分析, 攻击性安全, 物联网安全, 病毒分析, 逆向工具, 逆向工程