10.2

#diary #2025/10

热烈的启程

这篇日记写于启程前往杭州的高铁上。

先下二城

Architecture Lab

昨日几乎完成了 arch lab,由于暂时没有检索到正解,所以 part C 只停留在了 52/60,可以看出 part C 实际是很有难度的(毕竟 std 最好也只有 7.48 CPE,满分设到 7.50 还是太有挑战性了),以下是参考过的解答:

这是前三个 lab 中体量最大的一个 lab,出题人直接写了一整套完整的 YAS Assembler,ISA Simulator,SEQ Simulator,PIPE Simulator(甚至还有支持 step over 的 GUI Debug 版本)以及完整的 Benchmark Test 和 Regression Test,使用了各种奇妙的古董工具包括 Perl 脚本、TCL/TK 图形库、FLEX 语法检测,可以看出倾注了很多心血。

本来想读一下各种工具的源码的,不过在 Make 构建中发现了很多因为版本过于老旧的不兼容问题,包括但不限于

Part A 是用 y86-64 ISA 完成三个函数:sum 用循环实现链表键值求和,rsum 用递归实现链表键值求和,copy_block 复制 len 长的 long 数组 src 到 dest。体验了与 Attack Lab 不同的 y86-64 指令集汇编代码编写。由于此时书中进度还没有到 Linking 和 Virtual Memory,所以采用了最简单的从 PC = 0x00 开始运行,还需要手动开栈。可以提升对程序 private 内存架构的理解。

Part B 是在 SEQ 的 hcl 添加 iaddq immed, %reg 的实现,是对非流水线的分段的处理器组合逻辑很好的复习

Part C 是在 PIPE 下优化 ncopy 函数(复制 src 数组到 dst,并统计正数个数)以达到最小化 CPE 的目的,可以修改 ncopy.ys 和 pipe-full.hcl。

由于现代处理器的 Out-of-Order Execution 和 Superscalar 机制还是与 PIPE 的 Scalar pipeline 有一定差距,Part C 中的部分优化技术的理解似乎并不能直接迁移到现代处理器上。

Attack Lab

参考过的解答

本实验聚焦于两种利用 Buffer Overflow 的攻击技术 Code Injection 和 Return-Oriented Programming。可以强化一些机制理解 private virtual memory layout(stack),control transfer(rip, rsp, return address),x86-64 instruction encoding。

CI 包括 level 1, 2, 3

Return-Oriented Programming 包括 Level 4, 5,由于现代操作系统、编译器的 Random Stack Address 机制、栈数据不可执行的权限机制(如果只有第一点可以通过 pad nop 一定程度上突破。另外,实际上有了 Canary 之后直接 ban 掉了修改返回地址,Buffer Overflow Attack 又没落一分),无法知道自己注入的代码的准确位置,也无法执行栈上注入的代码,所以催生了 ROP 这种利用已有程序的片段(gadget,如 op + op + ... + op + ret)来进行组合,通过在 RA 之上排列一连串精心选择的 gadget 以达到自己的目的。

留白

由于旅行期间完全没动过笔记本,所以实际上这是一篇并没有写完的日记。