CSAPP bomblab实验:二进制炸弹解除指南

4星 · 超过85%的资源 需积分: 10 13 下载量 71 浏览量 更新于2024-09-09 收藏 216KB DOCX 举报
CSAPP bomblab实验报告 CSAPP bomblab是卡内基梅隆大学(CMU)CSAPP课程实验lab系列中的一个实验,旨在帮助学生理解汇编语言和使用gdb调试工具。实验的主要目的是让学生通过反汇编和逆向工程来确定六个字符串,从而解除炸弹。 实验原理 --------- 二进制炸弹是一个目标代码文件,提供给学生们的程序,运行时,它提示用户输入六个不同的字符串。如果其中任何一个不正确,炸弹就会“爆炸”:打印出一条错误信息。学生需要通过反汇编和逆向工程来确定是哪六个字符串,从而解除它们。 实验过程 ------------ ### 反汇编bomb 首先,我们需要将bomb反汇编并输出到txt文件中。打开终端,用objdump –dbomb > 1.txt反汇编bomb,并将汇编代码储存到文件1.txt中。 ### 分析汇编代码 通过分析汇编代码,我们可以看到它有一个main函数,phase_1到phase_6六个函数,一个secret_phase函数,表明我们要从phase_1到phase_6的代码中得到答案,除了六个关卡之外还有一个隐藏关卡。 ### Phase_1 在phase_1中,我们可以看到当(strings_not_equal)返回值%eax!=0时,炸弹会炸。再向上看,有立即数$0x804a15c,这里是当做地址用。故此地址储存的字符串即为通关密码。在gdb调试中调用指令查看,得到通关密码。 ### Phase_2 在phase_2中,首先注意到phase_2调用了函数(read_six_numbers)读入六个数。紧接着5条指令: ``` 8048d84: 837de000 cmpl $0x0,-0x20(%ebp) 8048d88: 7506 jne 8048d90<phase_2+0x26> 8048d8a: 837de401 cmpl $0x1,-0x1c(%ebp) 8048d8e: 7405 je 8048d95<phase_2+0x2b> 8048d90: e83c030000 call 80490d1<explode_bomb> ``` 是说第一个数为0,第二个数为1,否则bomb。接下来是一个循环,主要指令是add-0x8(%ebx),%eax,就是后一个数时它前两个数之和,很容易联想到斐波切纳数列。即输入斐波切纳数列前六个数即可:011235。 ### Phase_3 在phase_3中,注意到代码movl $0x804a23e,0x4(%esp),用gdb查看:x/s 0x804a23e,得到"%d%d",即要输入两个数。而cmp $0x1,%eax表明输入参数必须多于1个。再往下到达cmpl $0x7,-0xc(%ebp),即输入的第一个参数值必须小于等于7。 bomblab实验旨在让学生掌握汇编语言和gdb调试工具的使用,以便更好地理解计算机系统的工作原理。通过这个实验,学生可以学习到逆向工程和反汇编的技术,提高自己的编程能力和问题解决能力。