温馨提示×

怎样用Linux反汇编找漏洞

小樊
31
2025-12-07 22:50:31
栏目: 网络安全

Linux反汇编定位漏洞的实用流程

一 准备与信息收集

  • 合法授权与最小化环境:在隔离环境(如虚拟机/容器)中分析,避免对生产系统造成影响。
  • 工具链安装与基础命令:
    • 安装:sudo apt-get install binutils gdb radare2 ghidra(按需选择)。
    • 基础信息:
      • 查看ELF结构:readelf -h/-S your_binary
      • 符号与重定位:readelf -s/-r your_binary
      • 可打印字符串:strings -n 6 your_binary | sort -u
      • 安全特性:checksec --file=your_binary
  • 初步线索:从strings符号表入手,定位诸如**/bin/sh、system、execve、strcpy、sprintf、gets、scanf、malloc、free**等敏感字符串/函数,作为后续逆向重点区域。

二 静态反汇编分析

  • 快速反汇编与语法偏好:
    • objdump -d -M intel your_binary > dis.asm(Intel语法更易读)
    • 仅看代码段:objdump -d -j .text your_binary
    • 结合源码(若有调试信息):objdump -S your_binary
  • 交互式逆向与脚本化:
    • radare2:r2 your_binary → aaa(分析)→ pdf @ sym.main(反汇编函数)→ / str(搜索字符串)→ afvd(列出函数变量)
    • Ghidra:导入ELF → 运行分析 → 查看控制流图(CFG)数据流 → 使用脚本扩展批量模式匹配与污点标记
  • 定位高危模式(示例要点):
    • 内存/缓冲区操作:strcpy/memcpy/strcat/sprintf/snprintf/gets/scanf 等未限制长度的拷贝/格式化
    • 整数问题:有符号/无符号比较混用、整数溢出(add/sub/mul 后未检查)
    • 格式化字符串:printf(argv[i]) 类无条件格式化输出
    • 系统调用入口:动态解析或间接调用 execve/system,配合用户输入构造命令
    • 逻辑缺陷:strcmp/strncmp 的返回值误用、setuid/setgid 后未立即降权
  • 辅助脚本与自动化:
    • 使用 Capstone 编写自定义反汇编脚本,对特定指令序列(如“mov rdi, rsp; call system”)做批量扫描与交叉引用,提升定位效率。

三 动态调试与系统调用追踪

  • 断点与单步:
    • gdb your_binary
    • 设断点:break mainbreak *0x;运行:run < args;单步:stepi/nexti;查看栈/寄存器:x/40wx $rspinfo registers
  • 系统调用与文件行为:
    • 全量跟踪:strace -f -e trace=all ./your_binary
    • 聚焦文件/网络:strace -f -e trace=file,network ./your_binary
    • 结合反汇编:在可疑函数下断点,观察入参与寄存器变化,确认是否向危险函数传递了可控缓冲区/格式串/命令参数

四 常见漏洞模式与识别要点

漏洞类型 汇编/调用特征 快速验证思路
栈溢出 大量字节拷入栈上缓冲(如 rep movsb/cmpsb、带立即数的 mov/lea + add rsp, imm;函数尾声 leave; ret) 在复制/处理输入后下断点,检查RSP附近数据是否被覆盖;用gdb构造长输入观察是否改写返回地址
格式化字符串 调用 printf(fmt, …)fmt 来自用户输入 在 printf 前打印 fmt 内容;尝试 %x/%p/%s 泄露栈;观察是否可写任意地址
整数溢出/环绕 add/sub/mul 后未检查,随后用于分配/拷贝长度 在算术指令后查看标志与结果;尝试极大/极小数值触发分配异常或截断
命令注入/不安全调用 调用 system/execve 且参数拼接自用户输入 在调用前打印参数;尝试注入 ; id&& cat /etc/passwd 等验证执行
堆溢出/Use-After-Free 大量 malloc/calloc/realloc/free 与指针运算,或 free 后继续使用 在 free/use 点下断点,检查指针是否仍被解引用或进入可疑重用路径
以上模式在反汇编中常以“危险函数名 + 长度/格式/指针参数来自外部输入”的组合出现,结合CFG/污点动态断点可快速确认。

五 报告与修复建议

  • 报告要点:给出漏洞类型、触发路径、输入构造、寄存器/栈/内存证据(截图/日志)、影响范围与可利用性;附最小 PoC与复现步骤。
  • 修复方向:
    • 输入校验与边界:使用长度受限函数(如 strncpy/strlcpy/snprintf),严格检查返回值长度计算是否溢出
    • 格式化安全:使用printf(“%s”, buf) 替代 printf(buf);或采用libfmt等安全封装
    • 内存安全:启用ASLR/PIE/NX/Stack Canary/RELRO 等缓解;对关键路径进行静态/动态分析模糊测试
    • 最小权限:在需要提升权限后尽快降权/放弃特权,避免持久化高权限上下文
  • 合规提示:仅在获得明确授权的前提下进行安全测试与逆向分析,避免触犯法律与合规要求。

0