{ "topic": "buffer-overflow", "type": "short_answer", "schema_version": "1.0.0", "generated": "2026-09-17T00:00:00+08:00", "questions": [ { "id": "sa-001", "type": "short_answer", "difficulty": 2, "tags": [ "栈溢出", "漏洞利用" ], "question": "请简述经典的栈溢出攻击的基本步骤,包括攻击者如何控制程序执行流。", "answer": "经典的栈溢出攻击步骤如下:(1) 攻击者向程序输入超长数据,使数据超出目标缓冲区的大小;(2) 溢出的数据依次覆盖保存的 EBP(帧指针)和函数返回地址;(3) 攻击者将返回地址修改为 shellcode 的地址或其他目标地址(如 system() 函数);(4) 当被溢出的函数执行 return 指令时,CPU 从栈上弹出被篡改的返回地址并跳转到该地址执行;(5) 程序执行流被劫持到攻击者指定的恶意代码。", "keywords": [ "返回地址", "溢出", "覆盖", "shellcode", "执行流", "EBP", "return" ], "scoring_rubric": "满分需描述:(1) 输入超长数据导致溢出(2分);(2) 覆盖返回地址(2分);(3) 将返回地址修改为恶意地址(2分);(4) 函数返回时跳转到恶意代码执行(2分);(5) 整体逻辑清晰连贯(2分)。部分正确按点给分。", "source": null, "related": [], "explanation": "" }, { "id": "sa-002", "type": "short_answer", "difficulty": 2, "tags": [ "aslr", "dep", "漏洞利用" ], "question": "分别解释 DEP 和 ASLR 的防御原理,并说明它们各自可以防御哪类攻击。", "answer": "DEP(数据执行保护):通过硬件 NX/XD 位将栈、堆等数据内存区域标记为不可执行。当 CPU 尝试在这些区域执行指令时会触发异常。DEP 主要防御直接在栈/堆上注入并执行 shellcode 的攻击方式。ASLR(地址空间布局随机化):在每次程序运行时随机化栈、堆、共享库、PIE 可执行文件等关键内存区域的基地址。ASLR 主要防御需要预先知道内存地址的攻击,如精确跳转到 shellcode 或已知函数地址的攻击。两者互补:DEP 阻止代码注入,ASLR 阻止地址预测,但都不能单独防御所有攻击(如信息泄露+ROP 可以同时绕过两者)。", "keywords": [ "NX", "不可执行", "随机化", "基地址", "shellcode", "地址预测", "互补" ], "scoring_rubric": "满分需包含:(1) DEP 原理——NX 位/数据区域不可执行(2分);(2) DEP 防御——阻止 shellcode 执行(1分);(3) ASLR 原理——随机化内存布局/基地址(2分);(4) ASLR 防御——阻止地址预测(1分);(5) 说明两者互补但可被绕过(2分);(6) 表述准确完整(2分)。", "source": null, "related": [], "explanation": "" }, { "id": "sa-003", "type": "short_answer", "difficulty": 3, "tags": [ "rop", "漏洞利用" ], "question": "什么是 ROP(Return-Oriented Programming)?请解释其基本原理、与传统 shellcode 注入的区别,以及为什么 ROP 能绕过 DEP 保护。", "answer": "ROP(面向返回的编程)是一种代码复用攻击技术。基本原理:攻击者在程序或共享库的已执行代码段中搜索以 ret 指令结尾的短小指令序列(称为 gadget),然后在栈上精心布局这些 gadget 的地址。每次函数返回(ret)时,程序跳转到栈上下一个 gadget 的地址执行,执行完该 gadget 的指令后又遇到 ret,继续跳转到下一个 gadget,如此串联形成攻击链。与传统 shellcode 注入的区别:(1) 不需要在数据区域注入新代码;(2) 利用的是已有的、合法的、可执行的代码片段。能绕过 DEP 的原因:DEP 将数据区域标记为不可执行,但 ROP 使用的 gadget 位于代码段(.text),代码段本身就是可执行的,因此不触发 DEP 保护。", "keywords": [ "gadget", "ret", "代码复用", "代码段", "可执行", "不注入新代码", "串联" ], "scoring_rubric": "满分需包含:(1) ROP 基本定义——代码复用攻击(2分);(2) gadget 概念——以 ret 结尾的代码片段(2分);(3) 执行方式——栈上布局 gadget 地址,ret 串联执行(2分);(4) 与 shellcode 注入的区别——不注入新代码(2分);(5) 为何绕过 DEP——gadget 位于可执行代码段(2分)。", "source": null, "related": [], "explanation": "" } ] }