4、固件二进制分析:字符串分析、硬编码凭据搜索、敏感信息泄露检测

各位同学,咱们今天聊点实在的。拿到一个支付终端的固件,你第一件事会做什么?

我个人习惯,不是急着反汇编,也不是跑动态调试。我会先做一件事——字符串分析。说白了,就是拿binwalk或者strings工具,把固件里所有可见的字符串扒出来,先扫一遍。这步看起来简单,但往往能挖出大问题。

4.1 字符串分析:从“明文”中找线索

固件本质上就是个二进制大包。里面藏着各种调试信息、路径、版本号、甚至注释。这些信息,对攻击者来说,就是一张“藏宝图”。

我记得有一次,我分析某款POS机的固件。用strings一跑,直接看到了这么一行:

/home/developer/payment_app/debug/config.ini

嗯,开发者把调试配置文件的路径留在了固件里。顺着这个路径,我找到了一个硬编码的测试密钥。你说这危不危险?

所以,字符串分析的核心目标有三个:

  • 识别敏感路径:比如配置文件、日志文件、数据库路径。
  • 发现调试信息:比如“DEBUG: transaction approved”、“TEST MODE”等。
  • 定位关键函数:比如加密函数、认证函数的名称。
小技巧: 我建议你用 strings -n 6 firmware.bin 来提取长度至少6个字符的字符串。太短的字符串噪音太多,比如“OK”、“NO”这种,基本没用。

4.2 硬编码凭据搜索:最怕的就是“写死”

你想想看,支付终端里最怕什么?最怕的就是密钥、密码、Token被“写死”在固件里。一旦被提取出来,整个支付链路的安全性就崩塌了。

硬编码凭据的搜索,说白了就是一场“找茬”游戏。我们需要在二进制数据中,找到那些本不该出现的明文凭据。

常见的硬编码凭据包括:

  • 对称密钥:AES、DES密钥,通常是16字节或32字节的随机数据。
  • 私钥:RSA私钥,通常以“-----BEGIN RSA PRIVATE KEY-----”开头。
  • 密码/口令:比如数据库密码、SSH密码、API密钥。
  • Token/会话ID:用于身份认证的临时凭据。

怎么搜?我一般用两种方法:

  1. 正则表达式搜索:比如搜索 [A-Za-z0-9+/]{32,} 来匹配Base64编码的密钥。
  2. 熵值分析:高熵值的数据块,很可能是加密密钥或压缩数据。
注意: 我曾经在一个项目中,用熵值分析发现了一个高熵区域。一开始以为是加密密钥,结果分析后发现是JPEG图片的压缩数据。所以,熵值分析只能作为辅助手段,不能完全依赖。

这里我给大家一个简单的Python脚本,用于在固件中搜索常见的硬编码凭据模式:

import re
import sys

def search_hardcoded_credentials(file_path):
    with open(file_path, 'rb') as f:
        data = f.read()

    # 搜索RSA私钥
    rsa_pattern = rb'-----BEGIN RSA PRIVATE KEY-----'
    if re.search(rsa_pattern, data):
        print("[!] 发现RSA私钥!")

    # 搜索AES密钥(16字节随机数据,熵值较高)
    # 这里简化处理,实际需要更复杂的熵值计算
    # 搜索类似 "key=" 或 "secret=" 的字符串
    key_patterns = [rb'key\s*=\s*([A-Za-z0-9+/=]{16,})', 
                    rb'secret\s*=\s*([A-Za-z0-9+/=]{16,})']
    for pattern in key_patterns:
        matches = re.findall(pattern, data, re.IGNORECASE)
        for match in matches:
            print(f"[!] 发现疑似密钥: {match.decode('utf-8', errors='ignore')}")

if __name__ == "__main__":
    search_hardcoded_credentials(sys.argv[1])

4.3 敏感信息泄露检测:不止是凭据

硬编码凭据只是冰山一角。敏感信息泄露的范围其实更广。你想想看,固件里还可能藏着什么?

  • 内部IP地址:比如数据库服务器、管理后台的IP。
  • 域名/URL:比如API接口地址、更新服务器地址。
  • 版本信息:比如OpenSSL版本、Linux内核版本,这些信息可以帮助攻击者找到已知漏洞。
  • 调试日志:比如打印了完整的交易数据、持卡人信息。

我遇到过最夸张的一次,是在一个固件里直接找到了一个完整的SQL查询语句:

SELECT * FROM transactions WHERE card_number = '4111111111111111'

嗯,测试卡号就这么明晃晃地躺在那里。你说这要是被恶意软件提取了,后果不堪设想。

所以,敏感信息泄露检测,我建议你建立一个“关键词黑名单”。比如:

类别 关键词示例
IP地址 192.168., 10.0., 172.16.
域名 .com, .cn, .local, api., admin.
版本信息 OpenSSL 1.0.1, Linux 2.6.32
调试信息 DEBUG, LOG, TRACE, TEST
卡号模式 4[0-9]{12,15}, 5[1-5][0-9]{14}
核心思路: 字符串分析是“广撒网”,硬编码凭据搜索是“重点捕捞”,敏感信息泄露检测是“查漏补缺”。三者结合,才能对固件的安全性有一个全面的评估。

4.4 本章知识体系

为了让大家更直观地理解这三者之间的关系,我画了一张图:

固件二进制分析核心流程 固件二进制文件 字符串分析 提取可见字符串 硬编码凭据搜索 正则/熵值分析 敏感信息泄露检测 关键词黑名单 输出:安全风险报告(含风险等级、位置、修复建议)

从这张图你可以看到,固件二进制分析不是孤立的一步。它从固件文件出发,经过三个维度的分析,最终汇总成一份安全风险报告。这份报告里,要明确标出风险等级、具体位置(偏移地址),以及修复建议。

好了,关于固件二进制分析中的字符串分析、硬编码凭据搜索和敏感信息泄露检测,我就讲到这里。记住,这些技术看起来简单,但实战中非常有效。下次你拿到一个固件,不妨先按这个流程走一遍,说不定会有惊喜。

避坑指南: 我曾经在分析一个固件时,发现了一个看似是密钥的字符串,兴奋了半天。结果仔细一看,是某个库函数的版本号。所以,不要轻易下结论,一定要结合上下文和反汇编结果进行验证。

公众号:蓝海资料掘金营,微信deep3321