________ ________ _____ ______ ________ ___ ________ ________
|\ __ \|\ __ \|\ _ \ _ \|\ __ \|\ \ |\ __ \|\ __ \
\ \ \|\ /\ \ \|\ \ \ \\\__\ \ \ \ \|\ /\ \ \ \ \ \|\ \ \ \|\ /_
\ \ __ \ \ \\\ \ \ \\|__| \ \ \ __ \ \ \ \ \ __ \ \ __ \
\ \ \|\ \ \ \\\ \ \ \ \ \ \ \ \|\ \ \ \____\ \ \ \ \ \ \|\ \
\ \_______\ \_______\ \__\ \ \__\ \_______\ \_______\ \__\ \__\ \_______\
\|_______|\|_______|\|__| \|__|\|_______|\|_______|\|__|\|__|\|_______|
完成包括六个普通 phase 和一个 secret phase 的炸弹,并完成实验报告。
本仓库仅需上传报告文件,无需上传炸弹文件。
通过访问 炸弹编译 进行炸弹的编译和下载。通过访问 计分板 查看自己的炸弹爆炸结果。
注意: 以上两个网站需要校园网访问,所以不要挂梯子。
本次实验要求拆解炸弹并完成报告,共计 6 个 phase 以及 1 个 secret phase。
请参考报告模板 report/report.md 完成报告上传到 Github 中。在完成报告前,你可能需要复习我们的总体要求。
报告的分数分布如下:
- 在报告中贴上自己的scoreboard得分(1分),表格中填写自己每道题的分数(1分)
- 每道题自己的分析(3*7分),每道题的答案(1*7分)
- 请务必填写正确的分数,请务必贴上正确的scoreboard得分界面。分数错误者扣1分,截图错误者扣5分。
- 即使某道题目没有做出来,也请将自己对题目的分析写在报告中,分析分和答案分是分开计算的。
- 分析描述中可以使用图片,但请尽量保证每道题不超过两张图片
- 如果你有完成nuclear bomb的内容,也可写在报告中
成绩由以下几个部分组成:
炸弹完成分数 = 10 × 炸弹按时完成数量 + 8 * 炸弹延时提交数量
最终得分 = 炸弹完成分数 + max(y × 报告分数, 20) - 0.5 × 爆炸次数
- 延期提交后,scoreboard 记录的炸弹分数会变成原来的0.8倍
- 炸弹完成分数以 scoreboard 记录为准
访问 http://ics.men.ci/bomb,完成微人大验证,某些浏览器可能需要点击高级设置->继续前往,点击complie后刷新网页,再点击Download下载你的 bomblab。
注: 短时间访问会导致服务器卡顿,所以有可能刷新后没有反应,属于正常现象。如果长时间无法下载,请联系助教。
今年实验不限制解答的主机名称,同学们可以在自己的环境下布置(请使用linux,其它系统下出现的bug概不负责(bushi))
tar -xvf bomblab.tar
cat READMEREADME中有这个炸弹的信息,同学们可以通过对比是否是自己的学号进行判断。每个人的炸弹都是通过学号定制的,每个人的答案都不一样,请同学们不要泄露自己的bomb。同时也不要把自己的bomb给别人。
./bomb中每个炸弹都需要一个输入,当你输入合适的输入后,炸弹就会解除,并视情况进入下一个炸弹。反之,你的炸弹就会爆炸。通过和爆炸都会被记录下来,并上传到服务器。以下是一些拆弹的辅助手段:
-
objdump 反汇编:
objdump -d ./bomb > bomb.dump,bomb.dump是程序的汇编代码。 -
gdb:
gdb bomb。同时在调试时,可以用layout asm实时查看汇编指令。基本的gdb调试命令请参考CS:APP P193-P194。 -
你可以将答案记录到一个文件,比如
solution.txt,文件的内容和你拆弹时的输入一致(一行为一个phase的输入)。然后将文件名作为参数启动 bomb,例如./bomb solution.txt,它会自动读取文件的内容作为输入(如果文件里只写了前几个phase的答案,后续需要在控制台手动输入其它phase的答案)。也可以用gdb启动:
gdb -args bomb solution.txt通过访问http://ics.men.ci/bomb/scoreboard,可以观察每道题的通过与爆炸情况。数字是爆炸次数,淡青色背景表示题目通过。注意,爆炸次数会一定程度影响你的最终分数(网站分数仅供参考)。ddl之后网站不再接受炸弹的解除信息,请务必在ddl前进行炸弹拆除,并及时关注自己的爆炸情况。
拆除nuclearlab会使用到一些常见(?)技巧
打开参数为:
./nuclearlab <student_id> <password>请在发放的压缩包README中获取你的password。
可能需要修改 nuclearlab 为可执行:
chmod 755 nuclearlab- CS:APP P193-P194:介绍了gdb的基本使用方法,顺便提醒一下大家多看这本教材。
- bilibili Linux 使用gdb调试入门:同样介绍了使用gdb的基本调试方法,可以作为补充。
- IDA使用教程:一个方便的反汇编工具(optional)
-
你需要在你的github仓库中提交实验报告,请确保 scoreboard 上面有你的成绩,实验截至时间初步定在 2025年12月17日晚上23:55。
-
在 run/continue 之前确保打好断点,防止爆炸。你也可以思考如何使一个"功能完备"的bomb变得"功能残缺",使得它无法通信、无法爆炸。这将在某种程度上便利你的拆弹工作。
-
你可以试着不用知道答案,借助gdb速通bomblab(小心栈、变量等各种问题导致程序挂掉)。(助教注:现在服务器会在本地验证你的代码,也就是说直接跳过去的方式行不通)当然最后你还需要正常完成实验来完成你的报告。
-
你的拆弹过程应当包含理解汇编语言(报告30分)。
-
如果出现本地拆除、服务端排行榜没同步的情况,在少许等待后如果仍然没反应,请联系助教。
-
多次拆弹中打断点十分麻烦,可以通过文件设置的方法打断点
方案一: 命令行参数,如
gdb --ex "break main" program方案二(推荐): 创建
.gdbinit文件,并在里面按照以下格式写入断点b phase_1 b phase_2 b "想要打断的函数"在配置.gdbinit文件,可能你会碰到权限问题,解决方法如下:
mkdir -p /root/.config/gdb echo "add-auto-load-safe-path /home/bomblab/.gdbinit" >> /root/.config/gdb/gdbinit (把/home/bomblab换成你自己的路径)或者 echo "set auto-load safe-path /" >> /root/.config/gdb/gdbinit (不推荐) 如果你不是root用户: sudo mkdir -p /root/.config/gdb echo "add-auto-load-safe-path /home/bomblab/.gdbinit" | sudo tee -a /root/.config/gdb/gdbinit (依然记得替换你自己的路径!)
eg. 在使用完之后,记得在gdb运行时输入
info b查看当前断点状态,防止错误爆炸。 -
你可以选择安装vscode插件来为你的汇编提供高亮。在Extension中安装x86 and x86_64 Assembly,为asm后缀的文件提供高亮。
-
祝大家玩的愉快。
可以尝试清一下cookies或者重启浏览器。如果以上两者均尝试过但是还是长时间无法登入,请联系助教。
重新生成一下炸弹,这个原因是本地炸弹和服务器信息不匹配造成的。
在资源管理器左下方的linux中打开,并按照Ubuntu->home ->用户名的顺序进入,将文件拖进去。随后打开wsl解压即可。
这个是因为vscode在保存txt文件时在尾部使用了 CRLF 作为换行符导致的,这个换行符在linux脚本中会引起各种未知bug。
解决方案: 使用 echo "Your answer" >> solution.txt 进行保存
输入 chmod 755 bomb 解决问题
CTRL+C 关闭运行程序,随后 quit 退出gdb,之后重新打开就好。