22
33> Deadline:2025-11-11 23:59:59
44
5- ## 〇、实验简介与实用小工具
5+ ## 〇、实验简介
66
77### 实验简介
88
1717- 在栈帧基础上探索更多有意思的功能,如** 协程**
1818- 从高处思考程序** 控制流** 的运行
1919
20- ### 一些实用 GDB 指令
21-
22- 本实验中需要经常使用 GDB 动态调试程序查看栈帧变化,以下是一些常用指令提示:
23-
24- - ` x/5i $rip ` :以汇编指令形式查看当前指令及后续 4 条指令
25- - ` x/10gx $rsp ` :以十六进制形式查看当前栈顶及后续 9 个栈位置的值
20+ > [ !tip]
21+ >
22+ > 本实验中需要经常使用 GDB 动态调试程序查看栈帧变化,以下是一些常用指令提示:
23+ >
24+ > - ` x/5i $rip ` :以汇编指令形式查看当前指令及后续 4 条指令
25+ > - ![ 查看指令] ( flowlab/rip_gdb.png )
26+ > - ` x/10gx $rsp ` :以十六进制形式查看当前栈顶及后续 9 个栈位置的值
27+ > - ![ 查看栈帧] ( flowlab/rsp_gdb.png )
28+ > - ` b *[address] ` :直接在指定地址处设定断点(例如 ` b *0x401000 ` )
29+ > - ![ 设定断点] ( flowlab/b_gdb.png )
2630
2731## 一、危险的计算器
2832
@@ -155,7 +159,7 @@ void foo() {
155159
156160> [! NOTE ]Problem 1.1 (5 pts)
157161>
158- > 除了在报告描述你的攻击流程之外,你还需要在报告中回答以下问题:实验任务中导致溢出的函数早就成为了一个臭名昭著的函数,现如今几乎没有人会再使用它。但即使在 2024 年的今天,我们依然会看到许许多多的栈溢出、堆溢出漏洞。请你思考一下,还有什么其他的场景、函数会导致溢出?你自己是否在编程中遇到过栈溢出的情况?
162+ > 除了在报告描述你的攻击流程之外,你还需要在报告中回答以下问题:实验任务中导致溢出的函数早就成为了一个臭名昭著的函数,现如今几乎没有人会再使用它。但即使在 2025 年的今天,我们依然会看到许许多多的栈溢出、堆溢出漏洞。请你思考一下,还有什么其他的场景、函数会导致溢出?你自己是否在编程中遇到过栈溢出的情况?
159163
160164# # 二、更危险的计算器
161165
@@ -228,10 +232,12 @@ gcc -fno-pie -no-pie -o dark-calc-my dark-calc.c
228232
229233> [ !NOTE] Problem 3.2 (5 pts)
230234>
231- > 尝试查询资料,复原出之前实验中 ` dark-calc ` 的编译指令。
235+ > 尝试根据资料复原出之前实验中 ` dark-calc ` 的编译指令。
232236
233237> [ !tip]
234- > 通过特定命令行参数,可以不开启防御机制;
238+ >
239+ > 通过** 特定命令行参数** ,可以不开启防御机制;
240+ >
235241> 为触发可写栈空间漏洞,编译时包含了额外文件,不仅包含 ` dark-calc.c ` 。
236242
237243## 四、栈帧的更多应用——协程
@@ -245,6 +251,7 @@ gcc -fno-pie -no-pie -o dark-calc-my dark-calc.c
245251> [ !warning]
246252>
247253> 本实验中,各测试** 默认注释掉** ,需手动删除 ` main.cpp ` 中的注释符号来开启;
254+ >
248255> 提交时,请留下你能通过的测试,** 将其他测试注释掉,否则会影响评分** 。
249256
250257### 前言
@@ -398,6 +405,7 @@ naive_func(void **p):
398405> [ !tip]
399406>
400407> 按照 x86-64 调用约定,rdi 和 rsi 分别为函数调用的第一二个参数,rax 为函数调用的返回值。在默认情况下,gcc 使用 AT&T 汇编语法。如果你想要使用 Intel 汇编语法,可以在 ctx.S 的开头加上一句 ` .intel_syntax noprefix ` 。
408+ >
401409> 禁止使用 setjmp、longjmp 或 __ builtin_setjmp 等现成函数,但你** 可以参考它们的实现** 。
402410
403411### 基于上下文回退的异常处理
@@ -479,6 +487,7 @@ catch{
479487> [ !tip]
480488>
481489> C 语言提供了 cleanup 属性,被添加该属性的变量会在生命周期结束时执行对应的函数,可以理解为类似析构函数的功能,可参考[ 这里] ( https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html ) 。我们实现了 ` __err_cleanup ` 函数作为对 ` __err_try ` 执行清理操作的接口。
490+ >
482491> ** 可以阅读 ` context.h ` 中对 ` try ` 、` catch ` 和 ` throw ` 的宏定义** ,帮助理解错误处理栈的应用场景,为接下来的 Task 4.3 做准备。
483492
484493### 基于上下文切换的生成器(协程)
0 commit comments