讲漏洞不能从"某个 Payload 怎么弹"开始,要从计算机为什么会被误导开始。所有具体缺陷——溢出、注入、越权、反序列化——都是同一个根源在不同层的实例:软件赖以正确运行的一条约束被打破,而这条打破能被外部输入触发,并沿一条路径传导到一个能产生动作的点。本章把这条根源拆到架构、内存、权限和开发者假设四层,先看见约束在哪,后面才看得懂约束怎么断。 ### 1.1 冯·诺依曼架构的限制 #### 1.1.1 数据与指令的混用 今天的通用计算机跑在冯·诺依曼架构上:程序指令和处理数据存放在同一块物理内存里,走同一条系统总线,CPU 取指令和取数据用的是同一套地址译码。这个设计换来了存储的灵活——程序可以像数据一样被读写、被动态生成,代价是一个先天事实:CPU 从硬件层面分不清内存里的一个字节是"要执行的指令"还是"要处理的数据"。 把 CPU 的一次执行拆成微过程看,这个事实更清楚。 - 取指:程序计数寄存器(x86-64 为 `rip`)存着下一条指令的地址,CPU 按这个地址经总线从内存取出机器码字节流。 - 译码:译码器按操作码把字节流翻译成"做什么动作、用哪些寄存器",它