Skip to content

Commit c0849a2

Browse files
authored
Merge pull request #30 from ICS-25Fall-FDU/stacklab-docs-fix
Some format fix and examples of gdb instructions
2 parents 2f82d11 + 77d7dd1 commit c0849a2

File tree

4 files changed

+19
-10
lines changed

4 files changed

+19
-10
lines changed

docs/lab/flowlab/b_gdb.png

397 KB
Loading

docs/lab/flowlab/rip_gdb.png

451 KB
Loading

docs/lab/flowlab/rsp_gdb.png

932 KB
Loading

docs/lab/lab3.md

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
> Deadline:2025-11-11 23:59:59
44
5-
## 〇、实验简介与实用小工具
5+
## 〇、实验简介
66

77
### 实验简介
88

@@ -17,12 +17,16 @@
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

Comments
 (0)