这一页把每个正文组件各用一次,展示它们在文章里的样子和交互,也方便在同一处检查样式、脚本和性能。数据全部是示例:地址取自文档保留段,主机用 example.com 系列域名,哈希、序列号和时间除非正文另有说明,都是虚构的。
网络
原始请求和响应,代替代理工具请求面板的截图:
POST /login HTTP/1.1
Host: app.example.com
Content-Type: application/x-www-form-urlencoded
user=alice&password=REDACTEDHTTP/1.1 303 See Other
Location: /
Set-Cookie: session=REDACTED; Path=/; Secure; HttpOnly; SameSite=Lax数据包列表、字段树和字节,代替协议分析器的截图:
| 序号 | 时间 | 源地址 | 目的地址 | 协议 | 长度 | 信息 |
|---|---|---|---|---|---|---|
| 1 | 0.000000 | 192.0.2.10 | 192.0.2.53 | DNS | 71 | Standard query 0x4a7c A example.com |
| 2 | 0.012204 | 192.0.2.53 | 192.0.2.10 | DNS | 87 | Standard query response 0x4a7c A example.com A 192.0.2.80 |
#1 · DNS · Standard query 0x4a7c A example.com
- Ethernet II, Src: 00:00:5e:00:53:0a, Dst: 00:00:5e:00:53:35
- Destination: 00:00:5e:00:53:35
- Source: 00:00:5e:00:53:0a
- Type: IPv4 (0x0800)
- Internet Protocol Version 4, Src: 192.0.2.10, Dst: 192.0.2.53
- 0100 .... = Version: 4
- .... 0101 = Header Length: 20 bytes (5)
- Time to Live: 64
- Protocol: UDP (17)
- Header Checksum: 0xda2e 未校验
- Source Address: 192.0.2.10
- Destination Address: 192.0.2.53
- User Datagram Protocol, Src Port: 53001, Dst Port: 53
- Source Port: 53001
- Destination Port: 53
- Length: 37
- Checksum: 0x923b
- Domain Name System (query)
- Transaction ID: 0x4a7c
- Flags: 0x0100 Standard query
- 0... .... .... .... = Response: Message is a query
- .... ...1 .... .... = Recursion desired: Do query recursively
- Questions: 1
- Queries
- example.com: type A, class IN
- Name: example.com
- Type: A (1)
- Class: IN (0x0001)
- example.com: type A, class IN
字节与布局
十六进制转储加字段标注,代替十六进制编辑器的截图:
EI_MAG0x00–0x03魔数 0x7F 加上 ASCII 的 E、L、FEI_CLASS0x042 = ELFCLASS64EI_DATA0x051 = 小端e_type0x10–0x113 = ET_DYN,PIE 也用这个值e_machine0x12–0x130x3E = x86-64e_entry0x18–0x1F入口点 0x1060
C 结构体的字节视图和字段表,代替结构体示意图或 pahole 输出:
| 偏移 | 名称 | 类型 | 大小 | 值 |
|---|---|---|---|---|
| 0x00 | mchunk_prev_size空闲时存放前一个块的大小 | size_t | 8 | |
| 0x08 | mchunk_size块大小;低 3 位是标志位 | size_t | 8 | 0x31 |
| 0x10 | fd | struct malloc_chunk * | 8 | 0x55555555a2c0 |
| 0x18 | bk已被覆盖 | struct malloc_chunk * | 8 | 0x4141414141414141 |
| 0x20 | fd_nextsize | struct malloc_chunk * | 8 | |
| 0x28 | bk_nextsize | struct malloc_chunk * | 8 |
寄存器的位布局,代替处理器手册里的插图(翻转任意一位,各字段随之重新解码):
| 位 | 字段 | 值 |
|---|---|---|
| 63 | XD禁止执行 | 1 |
| 62–59 | PK保护键 | 0x0 |
| 51–12 | Address页框的物理地址 | 0x0000012345 |
| 8 | G全局页 | 0 |
| 7 | PAT | 0 |
| 6 | D已写入(脏) | 1 |
| 5 | A已访问 | 1 |
| 4 | PCD | 0 |
| 3 | PWT | 0 |
| 2 | U/S
| 1 |
| 1 | R/W
| 1 |
| 0 | P存在 | 1 |
进程树,代替进程管理器的截图:
- explorer.exepid 4012user alice
- WINWORD.EXEpid 6120打开了 invoice.docm
- cmd.exepid 6644
- powershell.exepid 7020cmd powershell -nop -w hidden -enc …编码过的命令行
- conhost.exepid 7028
- powershell.exepid 7020cmd powershell -nop -w hidden -enc …编码过的命令行
- cmd.exepid 6644
- OneDrive.exepid 4388
- FileCoAuth.exepid 4502
- WINWORD.EXEpid 6120打开了 invoice.docm
调试与逆向
带地址和机器码的反汇编,代替反汇编器的截图:
可以逐步查看的调试器快照,代替调试器截图或单步执行的 GIF:
- 步骤 1/3leave 之前
rbp 指向保存的帧指针,返回地址就在它上方。
代码0x401136<add+16>8b 45 fcmoveax, dword ptr [rbp-0x4]当前指令:0x401139<add+19>c9leave0x40113a<add+20>c3ret寄存器- rax
- 0x2a
- rbp
- 0x7ffe3a8c1e40
- rsp
- 0x7ffe3a8c1e30
- rip
- 0x401139 <add+19>
标志- ZF1
- PF1
栈指向此处的寄存器 地址 值 说明 rsp 0x7ffe3a8c1e30 0x0000000000000000 0x7ffe3a8c1e38 0x0000002a00000000 局部变量 rbp 0x7ffe3a8c1e40 0x00007ffe3a8c1e60 保存的 rbp 0x7ffe3a8c1e48 0x0000000000401160 返回地址 内存地址 字节 0x7ffe3a8c1e40 60 1e 8c 3a fe 7f 00 00 60 11 40 00 00 00 00 00 - 步骤 2/3leave 之后
leave 等于 mov rsp, rbp 再 pop rbp。
代码0x401136<add+16>8b 45 fcmoveax, dword ptr [rbp-0x4]0x401139<add+19>c9leave当前指令:0x40113a<add+20>c3ret寄存器- rax
- 0x2a
- rbp
- 0x7ffe3a8c1e60(已改变,原值 0x7ffe3a8c1e40)
- rsp
- 0x7ffe3a8c1e48(已改变,原值 0x7ffe3a8c1e30)
- rip
- 0x40113a <add+20>(已改变,原值 0x401139)
标志- ZF1
- PF1
栈指向此处的寄存器 地址 值 说明 0x7ffe3a8c1e30 0x0000000000000000 0x7ffe3a8c1e38 0x0000002a00000000 局部变量 0x7ffe3a8c1e40 0x00007ffe3a8c1e60 保存的 rbp rsp 0x7ffe3a8c1e48 0x0000000000401160 返回地址 内存地址 字节 0x7ffe3a8c1e40 60 1e 8c 3a fe 7f 00 00 60 11 40 00 00 00 00 00 - 步骤 3/3ret 之后
ret 把返回地址弹进 rip。
代码0x401136<add+16>8b 45 fcmoveax, dword ptr [rbp-0x4]0x401139<add+19>c9leave0x40113a<add+20>c3ret寄存器- rax
- 0x2a
- rbp
- 0x7ffe3a8c1e60
- rsp
- 0x7ffe3a8c1e50(已改变,原值 0x7ffe3a8c1e48)
- rip
- 0x401160 <main+26>(已改变,原值 0x40113a)
标志- ZF1
- PF1
栈地址 值 说明 0x7ffe3a8c1e30 0x0000000000000000 0x7ffe3a8c1e38 0x0000002a00000000 局部变量 0x7ffe3a8c1e40 0x00007ffe3a8c1e60 保存的 rbp 0x7ffe3a8c1e48 0x0000000000401160 返回地址 内存地址 字节 0x7ffe3a8c1e40 60 1e 8c 3a fe 7f 00 00 60 11 40 00 00 00 00 00
标出关键帧、折叠库函数帧的调用栈,代替崩溃对话框的截图:
- #0(系统帧)0x7f3a2b9a1f2flibc.so.6!__memmove_avx_unaligned_erms+0x2f
- #1(系统帧)0x7f3a2b9a2a5dlibc.so.6!__memcpy_chk+0x1d
- #2(关键帧)0x7f3a2c01d9e4libpng16.so.16!png_read_row+0x1c4pngread.c:512
row_buf 只有 0x40 字节,而这一行有 0x200 字节。
- #30x7f3a2c01e1a0libpng16.so.16!png_read_image+0x5cpngread.c:720
- #40x55d0c0a01234viewer!load_image+0x9asrc/image.c:88
- #50x55d0c0a00f8aviewer!main+0x2asrc/main.c:31
- #6(系统帧)0x7f3a2b829d90libc.so.6!__libc_start_call_main+0x80
- #7(系统帧)0x7f3a2b829e40libc.so.6!__libc_start_main+0x89
- #80x55d0c0a00b55viewer!_start+0x25
控制流图,代替反汇编器图形视图的截图:
0x401126 cmp esi, 0x10
0x401129 jne bad
0x40112b xor ecx, ecx后继:bad(条件成立)、loop(条件不成立)。
0x40112d movzx eax, byte ptr [rdi+rcx]
0x401131 xor al, 0x5a
0x401133 cmp al, byte ptr [rdx+rcx]
0x401136 jne bad后继:bad(条件成立)、next(条件不成立)。
0x401145 xor eax, eax
0x401147 ret没有后继。
0x401138 inc ecx
0x40113a cmp ecx, 0x10
0x40113d jl loop后继:loop(条件成立)、ok(条件不成立)。
0x40113f mov eax, 1
0x401144 ret没有后继。
可执行文件的头部、节区和导入表,代替 PE 查看器的截图:
- 架构
- x86-64
- 类型
- EXE(控制台)
- 入口点
- 0x140001400
- 映像基址
- 0x140000000
- ASLR:启用
- DEP:启用
- CFG:未启用
- SafeSEHn/a
- Machine
- 0x8664
- AMD64
- NumberOfSections
- 4
- TimeDateStamp
- 0x66F2A1C0
- DllCharacteristics
- 0x8160
- HIGH_ENTROPY_VA | DYNAMIC_BASE | NX_COMPAT
| 名称 | RVA | 内存大小 | 文件偏移 | 文件大小 | 权限 | 熵 | 说明 |
|---|---|---|---|---|---|---|---|
| .text入口 | 0x00001000 | 0x1A2C | 0x00000400 | 0x1C00 | r-x | 6.21 | |
| .rdata | 0x00003000 | 0xF10 | 0x00002000 | 0x1000 | r-- | 4.87 | |
| .data | 0x00004000 | 0x640 | 0x00003000 | 0x200 | rw- | 1.02 | |
| .rsrc | 0x00005000 | 0x1E0 | 0x00003200 | 0x200 | r-- | 7.61 | 压缩过的图标 |
熵(位/字节)< 1 稀疏< 6.8 常规6.8–7.2 偏高≥ 7.2 压缩或加密
KERNEL32.dll4
GetStdHandleWriteConsoleWExitProcessVirtualProtect运行时修改页面保护属性
VCRUNTIME140.dll2
memset__C_specific_handler
进程内存布局,代替终端里 vmmap 或 /proc/<pid>/maps 的截图:
8 个区域 · 已映射 2.02 MiB · 4 处空洞 · 1 处 W+X
- 映像5
- 堆1
- 私有1
- 栈1
- 可写且可执行
- 作者标注
- 未映射(已压缩)
| 起始 | 结束 | 大小 | 权限 | 类型 | 模块 / 备注 |
|---|---|---|---|---|---|
| 0000555555554000 | 0000555555555000 | 4 KiB | r--p | 映像 | /usr/local/bin/demo |
| 0000555555555000 | 0000555555556000 | 4 KiB | r-xp | 映像 | /usr/local/bin/demo |
| 0000555555556000 | 0000555555558000 | 8 KiB | rw-p | 映像 | /usr/local/bin/demo |
| 0000555555558000 | 0000555555559000 | 4 KiB | 未映射 | ||
| 0000555555559000 | 000055555557a000 | 132 KiB | rw-p | 堆 | [heap] |
| 000055555557a000 | 00007ffff7d83000 | 42.7 TiB | 未映射 | ||
| 00007ffff7d83000 | 00007ffff7dab000 | 160 KiB | r--p | 映像 | /usr/lib/x86_64-linux-gnu/libc.so.6 |
| 00007ffff7dab000 | 00007ffff7f40000 | 1.58 MiB | r-xp | 映像 | /usr/lib/x86_64-linux-gnu/libc.so.6 |
| 00007ffff7f40000 | 00007ffff7fbb000 | 492 KiB | 未映射 | ||
| 00007ffff7fbb000 | 00007ffff7fbc000 | 4 KiB | rwxpW+X | 私有 | mmap(PROT_WRITE | PROT_EXEC) 得到的 RWX 页 |
| 00007ffff7fbc000 | 00007ffffffde000 | 128 MiB | 未映射 | ||
| 00007ffffffde000 | 00007ffffffff000 | 132 KiB | rw-p | 栈 | [stack] |
代码
读者只复制命令的终端会话,代替终端截图:
$ file ./hello
./hello: ELF 64-bit LSB pie executable, x86-64
$ id -u
1000给代码行加上编号注释,代替画了箭头的截图:
ssize_t n = read(fd, hdr, sizeof *hdr);
if (n != sizeof *hdr) return -1;
if (hdr->len > MAX_BODY) return -1;
body = malloc(hdr->len);- 即使读的是普通文件,
read返回的字节数也可能少于请求的数量。 - 这里把读不满当作错误;
n也可能是-1,同时设置了errno。 - 长度来自输入,用它决定分配大小之前必须先检查。
逐词标记、可以切换并排视图的补丁,代替代码审查页面的截图:
并排的两段代码,代替两张拼在一起的截图:
.method public static check(I)Z
const/4 v0, 0x1
return v0
.end methodstatic boolean check(int x) {
return true;
}数据
可以折叠、搜索的 JSON,代替解码后令牌的截图:
可排序、可筛选、自动识别列类型的表格,代替电子表格的截图:
| 端口 | 协议 | 服务 | Banner | 最近发现 |
|---|---|---|---|---|
| 22 | tcp | ssh | OpenSSH_9.6 |
2025-03-02 |
| 53 | udp | domain | — | 2025-02-28 |
| 161 | udp | snmp | — | 2025-02-27 |
| 443 | tcp | https | nginx |
2025-03-02 |
| 3306 | tcp | mysql | 8.0.36 |
2025-03-01 |
| 8080 | tcp | http-alt | Werkzeug/3.0.1 |
2025-03-01 |
直接由数字画出、附带数据表的图表,代替图表图片:
可以按级别和文字筛选的日志,代替日志控制台的截图:
2025-03-02T09:14:00.120Z INFO [main] auth - listening on 127.0.0.1:8443
2025-03-02T09:14:07.004Z WARN [http-3] auth - login failed user=admin src=198.51.100.7
2025-03-02T09:14:07.513Z WARN [http-3] auth - login failed user=admin src=198.51.100.7
2025-03-02T09:14:08.020Z WARN [http-3] auth - login failed user=admin src=198.51.100.7
2025-03-02T09:14:08.533Z WARN [http-3] auth - login failed user=admin src=198.51.100.7
2025-03-02T09:14:09.041Z ERROR [http-3] auth - rate limit reached, blocking 198.51.100.7 for 900s
2025-03-02T09:14:31.870Z INFO [http-5] auth - login ok user=deploy src=192.0.2.24 mfa=totp公式用 TeX 书写,不贴公式图片。行内:异或会抵消自身();单独成行:
安全分析产物
徽章颜色跟随 CVSS 分数的漏洞卡片,代替 CVE 页面的截图:
示例 ELF 解析库越界读
某示例 ELF 解析库在处理畸形的 e_shnum 时发生越界读取,可导致进程崩溃。
- 影响版本
- < 2.4.1
- 修复版本
- 2.4.1
- CWE
- CWE-125
- 报告
- 确认
- 修复
- 公开
多引擎扫描结果,代替在线扫描服务的截图(样本是 EICAR 测试文件,引擎名是虚构的):
58/66
eicar.com
66 个引擎中 58 个判为恶意,1 个判为可疑
- 恶意 58
- 可疑 1
- 未检出 7
- 不支持 4
- MD5
44d88612fea8a8f36de82e1278abb02f- SHA-1
3395856ce81f2b7382dee72602f798b642f14140- SHA-256
275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f
| 引擎 | 判定 | 检测名 | 版本 | 更新 |
|---|---|---|---|---|
| Aegis | 恶意 | EICAR-Test-File (not a virus) | 4.2.1 | |
| Bastion | 恶意 | EICAR_Test_File | — | |
| Cinder | 可疑 | Heur.TestString | — | — |
| Dagger | 未检出 | — | — | — |
| Ember | 不支持 | — | — | — |
按给定检查日期判断有效期的证书链,代替浏览器证书查看器的截图:
- 终端证书www.example.com
- 主体
- CN=www.example.com, O=Example Corp, C=US
- 签发者
- CN=Example TLS RSA CA 2026, O=Example Trust, C=US
- 有效期
- → 剩余 111 天 · 共 365 天
- 公钥
- EC P-256
- 签名算法
- sha256WithRSAEncryption
- 备用名称
- DNS www.example.com
- DNS example.com
详细信息序列号 · 1 个扩展 · 用途
- 序列号
04:7A:C1:9E:5B:20:3D:8F:61:0E:A4:C7:92:1B:58:E3- 密钥用途
- digitalSignature
- 扩展用途
- serverAuth, clientAuth
- 扩展
- basicConstraints 关键CA:FALSE
由下一级签发
- 中间 CAExample TLS RSA CA 2026
- 主体
- CN=Example TLS RSA CA 2026, O=Example Trust, C=US
- 签发者
- CN=Example Root CA, O=Example Trust, C=US
- 有效期
- → 剩余 1661 天 · 共 3652 天
- 公钥
- RSA 2048
- 签名算法
- sha256WithRSAEncryption
由下一级签发
- 根 CAExample Root CA
- 主体
- CN=Example Root CA, O=Example Trust, C=US
- 签发者
- CN=Example Root CA, O=Example Trust, C=US
- 有效期
- → 剩余 1872 天 · 共 9132 天
- 公钥
- RSA 4096
- 签名算法
- sha1WithRSAEncryption
分组并去活(defang)的失陷指标,代替威胁报告里表格的截图:
275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f投放器(EICAR 测试文件)首次发现
192[.]0[.]2[.]44:8443C2 监听端口
2001[:]db8[:][:]44
update[.]example[.]comC2,解析到下面的地址首次发现
hxxps://cdn[.]example[.]net/assets/app[.]js?v=3第二阶段载荷
billing[@]example[.]test钓鱼邮件发件人
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\ExampleSync持久化
Global\example-sync-7f3a
过程与叙述
带日期的时间线,代替时间线幻灯片:
- 报告 报告给厂商
PoC 已发送到 security@example.com。
- +2 天确认 厂商确认收到报告
- +12 天CVE 编号 预留 CVE-2024-XXXX
- +2 天修复 开发并测试修复
→ · 37 天
- +43 天发布 发布固件 2.4.1
- +31 天披露 发布安全公告
按约定在报告 90 天后公开。
带折叠输出的编号步骤,代替一连串截图:
- 1
启动有漏洞的版本
bash docker run --rm -p 127.0.0.1:8080:8080 example/fileserver:1.4.2 - 2
请求 Web 根目录之外的文件
服务端拼接路径时没有做规范化:
bash curl -s --path-as-is 'http://127.0.0.1:8080/static/../../etc/hostname'输出响应2 行
fileserver-7f3c响应output fileserver-7f3c - 3
确认修复
1.4.3 版对同样的请求返回
400 Bad Request。
同一件事在不同平台上的做法,代替每个系统各一张截图:
openssl s_client -connect example.com:443 -servername example.com </dev/null | openssl x509 -noout -datesPowerShell 没有 openssl,可以直接从连接上读取证书:
$tcp = [Net.Sockets.TcpClient]::new("example.com", 443)
$tls = [Net.Security.SslStream]::new($tcp.GetStream())
$tls.AuthenticateAsClient("example.com")
$tls.RemoteCertificate.GetExpirationDateString()在浏览器里绘制的时序图,代替导出的图片:
sequenceDiagram accTitle: SameSite=Lax 下的跨站 POST accDescr: evil.example 上的页面向 app.example.com 提交表单,浏览器不带会话 Cookie,服务端拒绝。 participant E as evil.example participant B as 浏览器 participant A as app.example.com E->>B: 自动提交的 form POST B->>A: POST /transfer(无 session Cookie) A-->>B: 403 Forbidden
在页面里播放的终端录像,代替 GIF:
图片只留给只有图片才能表达的内容:
编译器风格的提示块,分别用于补充说明、易错点和漏洞本身:
最后是藏在剧透后面的 CTF flag:
FLAG
flag{c0mp0n3nts_3v3rywh3r3}