先做非侵入式鉴定
拿到一个可疑的 Linux 可执行文件时,第一步不是运行它,而是做静态鉴定:file 判断实际类型(很多样本命名与真实格式不符),readelf 读取 ELF 头部与动态依赖,strings 提取可读字符串寻找地址、路径与命令片段。这三个命令都不执行样本代码,在任何环境下都相对安全。
不要用 ldd 看依赖
ldd 判断依赖的方式是让动态链接器去解析目标文件,对不可信的样本来说,这个过程可能触发样本中的代码,等于间接执行了它。替代方法是用 readelf -d 读取动态段里的依赖条目,得到的信息与 ldd 基本一致,但不会运行任何代码。
基本信息
| 适用平台 | Linux(binutils 套件:file、readelf、strings、objdump) |
|---|---|
| 常用命令 | file、readelf -h / -d / -S、strings -a |
| 安全原则 | 全程不执行样本,ldd 不用于不可信文件 |
| 输出要点 | 架构与类型、依赖库、节区结构、可读字符串 |
| 隔离要求 | 分析在隔离环境的副本上进行 |
典型使用场景
- 确认文件真实类型:扩展名与实际格式不符时以 file 输出为准
- 判断编译平台:架构与链接方式可解释为何在某主机上无法运行
- 提取外联线索:字符串里常能找到地址、路径与计划任务名称
- 查看节区与依赖:判断是否被加壳或存在可疑的自定义节区
- 为报告取证:记录哈希与关键输出,附在样本分析小节
静态鉴定
静态鉴定
# 真实文件类型与架构
file /tmp/suspicious.bin
sha256sum /tmp/suspicious.bin
# ELF 头部:类型、架构、入口点
readelf -h /tmp/suspicious.bin | head -20
# 动态依赖(替代 ldd,不执行样本)
readelf -d /tmp/suspicious.bin | grep -E 'NEEDED|RPATH|RUNPATH' | head
# 节区结构:是否被加壳或存在异常节名
readelf -S /tmp/suspicious.bin | head -20
# 字符串线索:地址、临时目录、编码痕迹
strings -a /tmp/suspicious.bin | grep -E 'http|/tmp|/dev/shm|base64|chmod|crontab' | head输出要点读法
| 来源 | 字段 | 含义 |
|---|---|---|
| file | ELF 类型与架构 | 与主机架构不符则无法运行 |
| readelf -h | Type 与 Entry point | 可判断是可执行还是共享库 |
| readelf -d | NEEDED 条目 | 需要的动态库,替代 ldd 输出 |
| readelf -S | 节区名与大小 | 异常节名或高熵指示加壳 |
| strings -a | 可读字符串 | 外联地址与命令片段常在此 |
任何涉及执行的动作(包括 ldd、直接运行、用调试器加载)都应在隔离环境并对副本进行,生产机上只做读取类操作。
字符串编码或加密后,strings 可能一无所获,这本身就是信息:说明样本做了处理,需要转为动态分析获取解密后的内容。