Files
examination/topics/cybersecurity/buffer-overflow/true_false.json
T
wonder 70e368e235
Deploy Examination / deploy (push) Successful in 7s
feat: add cybersecurity topic with 6 subtopics (204 questions)
New topic group: 网络安全专题 (cybersecurity)
Subtopics:
- web-security: Web 安全基础 (34 questions)
- crypto-basics: 密码学基础 (34 questions)
- buffer-overflow: 缓冲区溢出与漏洞利用 (34 questions)
- os-security: 操作系统安全 (34 questions)
- network-attack: 网络攻防 (34 questions)
- secure-coding: 安全编程实践 (34 questions)

Question types per subtopic:
- single_choice × 20
- true_false × 10
- short_answer × 3
- code_reading × 1

Difficulty range: 1-3 (基础)
2026-09-17 13:33:04 +08:00

142 lines
7.3 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"topic": "buffer-overflow",
"type": "true_false",
"schema_version": "1.0.0",
"generated": "2026-09-17T00:00:00+08:00",
"questions": [
{
"id": "tf-001",
"type": "true_false",
"difficulty": 1,
"tags": [
"缓冲区溢出"
],
"question": "C 语言中的 strcpy() 函数会自动检查目标缓冲区的大小,防止溢出。",
"answer": false,
"explanation": "strcpy() 不会检查目标缓冲区的大小,它只是简单地将源字符串复制到目标地址直到遇到 '\\0' 终止符。这是它成为缓冲区溢出经典案例的根本原因。要安全地复制字符串,应使用 strncpy()、strlcpy() 或 strcpy_s() 等带长度限制的替代函数。",
"source": null,
"related": []
},
{
"id": "tf-002",
"type": "true_false",
"difficulty": 2,
"tags": [
"dep",
"漏洞利用"
],
"question": "DEP(数据执行保护)可以完全阻止所有类型的缓冲区溢出攻击。",
"answer": false,
"explanation": "DEP 只能阻止在数据区域(如栈和堆)直接执行注入代码的攻击方式。但它无法阻止 ROP(Return-Oriented Programming)等不注入新代码的攻击技术,因为 ROP 利用的是已有可执行代码段中的 gadget。此外,JIT-Spray 等技术也可以绕过 DEP。因此 DEP 是重要的安全层,但并非万能。",
"source": null,
"related": []
},
{
"id": "tf-003",
"type": "true_false",
"difficulty": 2,
"tags": [
"aslr",
"漏洞利用"
],
"question": "当系统启用了 ASLR 后,攻击者就无法预测任何内存地址,因此缓冲区溢出攻击不可能成功。",
"answer": false,
"explanation": "ASLR 虽然随机化了内存布局,但可以通过信息泄露漏洞(如格式化字符串漏洞、越界读取等)获取已知模块的地址,从而计算偏移量绕过 ASLR。此外,部分系统中 ASLR 的熵可能不足(如 32 位系统的随机化空间有限),暴力破解也是可行的。还存在部分覆盖(partial overwrite)等技术。因此 ASLR 大大提高了攻击难度,但并非不可绕过。",
"source": null,
"related": []
},
{
"id": "tf-004",
"type": "true_false",
"difficulty": 1,
"tags": [
"栈溢出"
],
"question": "栈的增长方向是从高地址向低地址,而栈上缓冲区的写入方向通常是从低地址向高地址。",
"answer": true,
"explanation": "在 x86/x64 架构中,栈指针(ESP/RSP)在 push 操作时递减(向低地址增长),这是栈的生长方向。而数组/缓冲区的元素按索引递增方向存储(从低地址到高地址)。正是这两个方向的不一致,使得缓冲区溢出可以向高地址方向覆盖保存的 EBP 和返回地址,从而实现栈溢出攻击。",
"source": null,
"related": []
},
{
"id": "tf-005",
"type": "true_false",
"difficulty": 2,
"tags": [
"rop",
"漏洞利用"
],
"question": "ROP 攻击需要注入新的可执行代码到目标进程中。",
"answer": false,
"explanation": "ROP(Return-Oriented Programming)的核心特点恰恰是不注入任何新代码。它完全利用目标程序或其加载的共享库中已存在的代码片段(gadget),通过在栈上精心布局 gadget 地址,利用 ret 指令串联执行。正是因为不注入新代码,ROP 可以绕过将数据区域标记为不可执行的 DEP 保护。",
"source": null,
"related": []
},
{
"id": "tf-006",
"type": "true_false",
"difficulty": 1,
"tags": [
"缓冲区溢出"
],
"question": "gets() 函数已被 C11 标准正式废弃,不推荐在任何场景中使用。",
"answer": true,
"explanation": "gets() 函数由于天生不安全(没有任何方式限制读取长度),已被 C11 标准正式移除。POSIX 标准也已将其标记为废弃。如果程序中仍在使用 gets(),应替换为 fgets() 或其他带长度限制的输入函数。几乎所有现代编译器在检测到 gets() 使用时都会发出警告。",
"source": null,
"related": []
},
{
"id": "tf-007",
"type": "true_false",
"difficulty": 2,
"tags": [
"栈溢出"
],
"question": "Stack Canary 的值在每次进程运行时都是相同的,但每次函数调用时会变化。",
"answer": false,
"explanation": "在现代实现中,Stack Canary 的值在进程启动时随机生成(通过 /dev/urandom 等),每次进程运行时值都不同。在进程生命周期内,同一函数的 canary 值通常保持不变(进程级随机化)。有些实现可能在 fork 时刷新 canary,但典型的用户态程序中 canary 在进程级别是固定的,而非每次函数调用都变化。关键在于每次进程运行时的值不同,使得攻击者无法预先知道 canary。",
"source": null,
"related": []
},
{
"id": "tf-008",
"type": "true_false",
"difficulty": 1,
"tags": [
"缓冲区溢出"
],
"question": "缓冲区溢出漏洞只存在于 C/C++ 等不提供自动内存管理的语言中。",
"answer": true,
"explanation": "缓冲区溢出的根源是缺乏自动边界检查和内存安全保护。C/C++ 直接操作内存,不提供数组边界检查,是缓冲区溢出的高发语言。Java、Python 等语言提供自动内存管理和边界检查,不会产生经典的缓冲区溢出。但需注意:这些语言的底层解释器/虚拟机如果是用 C/C++ 实现的,其自身可能存在缓冲区溢出漏洞。从语言特性层面来说,该说法基本正确。",
"source": null,
"related": []
},
{
"id": "tf-009",
"type": "true_false",
"difficulty": 2,
"tags": [
"aslr",
"漏洞利用"
],
"question": "在 Linux 系统中,非 PIE(Position Independent Executable)的可执行文件加载地址是固定的,其代码段地址不受 ASLR 影响。",
"answer": true,
"explanation": "在 Linux 中,只有位置无关可执行文件(PIE,使用 -fPIE -pie 编译)的加载地址才会被 ASLR 随机化。非 PIE 可执行文件的代码段(.text)加载到固定的基地址(如 0x400000),不受 ASLR 影响。但其栈、堆、共享库(libc 等)地址仍然会被随机化。因此开启 PIE(编译选项 -pie)是提高 ASLR 有效性的重要措施。",
"source": null,
"related": []
},
{
"id": "tf-010",
"type": "true_false",
"difficulty": 1,
"tags": [
"缓冲区溢出"
],
"question": "地址无关代码(PIC / PIE)是一种缓解缓冲区溢出利用的防御机制。",
"answer": true,
"explanation": "PIE(Position Independent Executable)使可执行文件的代码段在每次加载时地址随机化,配合 ASLR 使得攻击者无法预测代码段地址,从而更难构造 ROP 链或预测 gadget 位置。虽然 PIE 本身不阻止缓冲区溢出的发生,但它是重要的利用缓解措施,提高了攻击者利用溢出漏洞的难度。这是纵深防御策略的一部分。",
"source": null,
"related": []
}
]
}