CSAPP Bomblab 题解

CSAPP Bomblab 题解

💡 原文中文,约35600字,阅读约需85分钟。
📝

内容提要

这篇文章详细记录了在Kali GNU/Linux环境下进行的“炸弹”程序解题过程。通过反汇编和调试,作者分析了程序的字符串比较、循环、跳转表、递归和链表等阶段,最终得出了一系列输入答案以成功拆除炸弹,并提到了一些编程技巧和调试工具的使用。

🔎

延伸解读

实验环境与个性化炸弹

文章在Kali GNU/Linux Rolling x86_64环境下进行,并指出HNU课程组为每个同学生成了不同的bomb,因此文中答案仅适用于作者自己的炸弹。这提醒读者,CSAPP Bomb Lab的答案并非通用,必须针对自己的二进制文件进行分析,不能直接照搬网络上的题解。

关键调试技巧:GDB与反汇编

作者反复使用objdump反汇编和gdb调试,通过断点、单步执行(ni)和查看寄存器/内存(如i r、x/4bs)来定位答案。例如在phase_1中,通过查看rsi指向的字符串直接得到答案。这些方法对于理解汇编代码和动态分析程序行为至关重要,是完成实验的核心技能。

各阶段核心机制解析

文章详细分析了六个phase及隐藏关卡:phase_1字符串比较、phase_2循环递增、phase_3跳转表、phase_4递归函数、phase_5链表遍历、phase_6链表排序,以及secret_phase的递归与链表。每个阶段都涉及不同的逆向工程技巧,如人肉IDA还原C代码、分析跳转表、理解递归逻辑等,全面锻炼了汇编阅读和程序分析能力。

隐藏彩蛋与额外挑战

secret_phase是一个隐藏关卡,需要在phase_4输入时额外添加字符串“DrEvil”才能触发。该关卡要求输入一个数字,通过fun7函数的递归计算返回3,最终答案为107。这体现了Bomb Lab的游戏化设计,鼓励探索和深入理解程序逻辑,而不仅仅是完成基本关卡。

❓

Q&A

在Kali GNU/Linux环境下如何拆除炸弹程序?

通过反汇编和调试,逐步分析每个阶段的输入要求,最终得出正确答案。

phase_1的正确输入是什么?

phase_1的正确输入是"Crikey! I have lost my mojo!"。

phase_2需要输入什么样的数字?

phase_2要求输入六个数字,满足条件a[0]+1=a[1],a[1]+2=a[2],依此类推,可能的答案为1 2 4 7 11 16。

phase_3的跳转表如何工作?

phase_3使用跳转表,根据输入的第一个数字进行跳转,正确答案为0 b 624,1 x 813,2 u 140,3 p 265,4 q 863,5 o 997,6 q 224,7 d 840。

phase_4的递归函数func4的输入要求是什么?

phase_4要求输入d2为2、3或4,得出d1为33*d2,可能的答案有66 2,99 3,132 4。

secret_phase的正确输入是什么?

secret_phase要求输入的字符串为"DrEvil",并通过fun7函数的递归计算,得出答案为107。

🏷️

标签

➡️

继续阅读