问题描述
炸弹实验
实验目的
本次实验为熟悉汇编程序及其调试方法的实验。
实验内容包含2个文件bomb(可执行文件)和bomb.c(c源文件)。
实验主题内容为:程序运行在linux环境中。程序运行中有6个关卡(6个phase),每个phase需要用户在终端上输入特定的字符或者数字才能通关,否则会引爆炸弹!那么如何才能知道输入什么内容呢?这需要你使用gdb工具反汇编出汇编代码,结合c语言文件找到每个关卡的入口函数。然后分析汇编代码,找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符通关。
实验需要用到gdb工具,可到网上查找gdb使用方法和参数。
实验环境
Ubuntu 16.04 32位
实验内容及步骤
一条来自老学姐的忠告:
说实话这个炸弹实验还是蛮有趣的,建议大家自己多尝试,实在没有思路了再来看网上的解决方案,而且做完以后分析汇编的能力真的大幅度提升呐!!!还有还有,做这个实验一定要一鼓作气,最好是找一天专门来拆,还有隐藏关,别被它吓到,其实不难,主要是看如何进去。
好啦,学姐不唠叨啦
下面咱们继续学习之旅
我爱学习!!!!
【实验原理】
二进制炸弹是作为一个目标代码文件提供给学生们的程序,运行时,它提示用户输入6个不 同的字符串。如果其中任何一个不正确,炸弹就会“爆炸”:打印出一条错误信息。学生通过反汇 编和逆向工程来确定是哪六个字符串,从而解除他们各自炸弹的雷管
【实验过程】
一、准备阶段
1、下载好32位的实验代码后,将文件解压缩并且通过共享文件夹操作将文件添加到虚拟机中,双击查看bomb.c代码,将c代码完整看了一遍,发现看这里的c代码是无从下手的,代码中只含有主函数,触发炸弹的过程被隐藏了起来。阅读老师给出的readme文件后,得知本题需要在Linux终端中对汇编代码进行分析并且调试才能得出答案。
2、输入objdump -d bomb,将可执行文件反汇编成汇编文件,为方便查看,可以使用objdump -d bomb >1.txt将汇编代码输出到txt文档里
3、试探一下炸弹爆炸的效果,gdb调试该可执行文件,随便输入一个字符串,果然爆炸了
二、开始拆炸弹
首先找到main函数,发现它调用了从phase1到phase6这六个函数。这几个函数就是每一关需要看懂的函数。
第一关:首先找到phase1,其代表的应该是第一关,代码如下:
首先进行汇编代码的分析,首先是esp指针向下移,创造了一个更大的空间,然后代码$0x804a1e4,0x4(%esp)有立即数,是将该地址的值传递到%esp+0x4的位置,输入gdb bomb 进入调试状态,使用x/s 0x804a1e4查看该地址的内容,回车显示处字符串“I am not part of the problem. I am a