前言
《深入理解计算机系统》官网:http://csapp.cs.cmu.edu/3e/labs.html
该篇文章是实验二Bomb Lab的Writeup机翻。
原文:http://csapp.cs.cmu.edu/3e/bomblab.pdf
阅读文档能对实验有所帮助。
在官网点击下方即可下载实验二的文件
1 介绍
邪恶的邪恶博士在我们的班级机器上植入了大量的“二元炸弹”。二元炸弹是一个由一系列阶段组成的程序。每个阶段都希望您在stdin上键入一个特定的字符串。如果您键入了正确的字符串,那么阶段将被解除,炸弹将继续进入下一个阶段。否则,炸弹会通过打印“BOOM!!”来爆炸,然后终止。当每个阶段都被拆除时,炸弹就被拆除了。
我们要处理的炸弹太多了,所以我们给每个学生一枚要拆除的炸弹。你的任务,你别无选择,只能接受,就是在截止日期前拆除炸弹。祝你好运,欢迎来到拆弹小组!
第一步:找到炸弹
你可以通过将浏览器指向:
http://
B
o
m
b
l
a
b
:
:
S
E
R
V
E
R
N
A
M
E
:
Bomblab::SERVER_NAME:
Bomblab::SERVERNAME:Bomblab::REQUESTD_PORT/
这将显示一个二进制炸弹请求表单供您填写。输入您的用户名和电子邮件地址,然后点击提交按钮。服务器将构建你的炸弹,并将它以一个名为bombk.tar的tar文件的形式返回给你的浏览器,其中k是你的炸弹的唯一编号。
将bombk.tar文件保存到您计划执行工作的(受保护)目录中。然后给出命令:tar -xvf bombk.tar。这将创建一个名为./bombk的目录,包含以下文件:
• README:确定炸弹和它的主人
• bomb:可执行的二进制炸弹。
• bomb.c:炸弹主要程序的源文件还有邪恶博士的友好问候。
• writeup.{pdf,ps}:实验室那样。
如果因为某些原因你要求多个炸弹,这不是一个问题。选择一个炸弹,然后删除其余的
第二步:拆除炸弹
你在这个实验室的工作是拆除你的炸弹。
你必须在一台课堂机器上做作业。事实上,有传言说,邪恶博士真的是邪恶的,如果跑到别处,炸弹总是会爆炸。据我们所知,炸弹里还有其他一些防篡改装置。
你可以使用许多工具来拆除炸弹。请参阅提示部分以获得一些提示和想法。最好的方法是使用您最喜欢的调试器来逐步完成反汇编的二进制文件。
每次你的炸弹爆炸都会通知炸弹服务器,你会在实验室的最终得分中损失1/2分(最多20分)。所以引爆炸弹是有后果的。你一定要小心!
前四个阶段各得10分。第5阶段和第6阶段稍微困难一些,所以每个阶段都值得获得15分。所以你的最高分数是70分。
虽然阶段变得越来越难以消除,但随着您从一个阶段移动到另一个阶段,您获得的专业知识应该可以抵消这个困难。 但是,最后阶段即使是最好的学生也会挑战,所以请不要等到最后一刻才开始。
炸弹忽略空白输入行。 例如,如果您使用命令行参数运行炸弹:
linux> ./bomb psol.txt
然后它将从 psol.txt 读取输入行,直到到达 EOF(文件结尾),然后切换到 stdin。 在虚弱的时刻,邪恶博士添加了此功能,因此您不必继续为已经解除的阶段重新键入解决方案。
为避免意外引爆炸弹,您需要学习如何单步执行汇编代码以及如何设置断点。 您还需要学习如何检查寄存器和内存状态。 做实验的一个很好的副作用是你会非常擅长使用调试器。 这是一项至关重要的技能,它将为您的职业生涯的其余部分带来丰厚的回报。
组织工作
这是一个单独的项目。 所有的手都是电子的。 澄清和更正将张贴在课程留言板上。
Handin
没有明确的指示。当你练习时,炸弹会自动通知你的教练你的进度。你可以通过查看班级记分牌来跟踪你的成绩:
http://
B
o
m
b
l
a
b
:
:
S
E
R
V
E
R
N
A
M
E
:
Bomblab::SERVER_NAME:
Bomblab::SERVERNAME:Bomblab::REQUESTD_PORT/scoreboard
这个网页不断更新,以显示每个炸弹的进展。
提示(请阅读!)
有很多方法可以拆除炸弹。您可以在不运行程序的情况下对其进行详细的检查,并确切地了解它的功能。这是一项有用的技术,但并不总是容易做到。您还可以在调试器下运行它,观察它一步一步地做什么,并使用这些信息来消除它。这可能是化解它的最快方法。
我们确实有一个请求,请不要使用暴力!你可以编写一个程序来尝试每一个可能的键来找到正确的键。但这是不好的几个原因
- 每次你猜错,炸弹就会爆炸,你会损失1/2分(最多20分)。
- 每次你猜错了,一条消息就会发送到炸弹服务器。您可能会很快使网络充满这些消息,并导致系统管理员取消您的计算机访问权限。
- 我们没有告诉你字符串有多长,也没有告诉你里面有什么字符。即使您做出了(不正确的)假设,即它们的长度都小于80个字符,并且只包含字母,那么对于每个阶段,您将有2680次猜测。这将需要很长时间运行,你不会在作业到期之前得到答案。
有许多工具被设计来帮助你弄清楚程序是如何工作的,以及当它们不能工作时是什么问题。这里列出了一些工具,你可能会发现有用的分析你的炸弹,并提示如何使用它们。
- gdb
GNU调试器,这是一个命令行调试器工具,可以在几乎所有平台上使用。您可以逐行跟踪一个程序,检查内存和寄存器,查看源代码和汇编代码(我们不会为大多数炸弹提供源代码),设置断点,设置内存监视点,并编写脚本。
CS:APP网站:
http://csapp.cs.cmu.edu/public/students.html
有一个非常方便的单页GDB摘要,您可以打印出来并用作参考。下面是一些使用gdb的技巧。- 为了避免每次输入错误时炸弹都会爆炸,你需要学习如何设置断点。联机文档,在gdb命令提示符中输入" help “,或在Unix提示符中输入” man gdb “或” info gdb "。有些人还喜欢在emacs中以gdb模式运行gdb。
- objdump -t
这会打印出炸弹的符号表。符号表包括炸弹中所有函数和全局变量的名称,炸弹调用的所有函数的名称,以及它们的地址。您可以通过查看函数名了解一些东西!
尽管objdump -d提供了许多信息,但它并没有告诉您全部情况。对系统级函数的调用以一种神秘的形式显示。例如,对sscanf的调用可能如下所示:
8048c36: e8 99 fc ff ff call 80488d4 <_init+0x1a0>
要确定调用是sscanf,需要在gdb中进行反汇编。 - strings
这个实用程序将显示炸弹中的可打印字符串。
正在寻找一种特殊的工具?文档怎么样?别忘了,命令和信息是你的朋友。特别是,man ascii可能会有用。info gas将会给你更多关于GNU汇编程序的信息。同时,网络也可能是信息的宝库。如果你被难住了,请向你的导师寻求帮助。