二进制炸弹--拆弹实验

二进制炸弹–拆弹实验

这是我们学校计算机系统基础课程的大作业实验,以下是我总结的每一关的通关方法。对于汇编语言的了解还不够深入,解释不好的地方还请大家批评指正。

那,我们就出发吧~

大作业要求

该大作业为闯关实验,共需破解7关。下载以自己学号命名的<学号>.tar压缩文件,在Debian系统里进行解压缩(例:$tar -xvf 987654321.tar)后,通过对可执行文件bomb反汇编,分析汇编代码并获取相关线索,从而破解每一关的输入内容,完成闯关。

实验一. 字符串比较
phase_0二进制炸弹--拆弹实验_第1张图片
使用 objdump 生成 bomb 程序的汇编代码,下图将汇编代码定位在给出了第一关字符串 对比的地方。可以看出在调用函数前,现将要参与对比的两个 字符串压入栈中,push $0x804b18c 就是存放内置字符串的首地址,pushl 0x8(%ebp)是用户 输入字符串的首地址。
二进制炸弹--拆弹实验_第2张图片
gdb 进行调试,断点设置在 b phase_0。这时根据汇编语句中发现的内置字符串首地址 0x804b18c,使用 examine 指令显示这个字符串为:All I/O devices are modeled as files.
二进制炸弹--拆弹实验_第3张图片

单步或继续执行后续的代码时输入这个字符串,结果显示成功过关。

第零关很easy,细心一点输入正确就好啦hhh

实验二.浮点表示
phase_1
二进制炸弹--拆弹实验_第4张图片
由 gdb 调试得知,在第二关需要输入的是两个整数。整数0x2e0f52aa使用单精度浮点数格式表达为0x4E383D4B,分别将高低位字节转换为十进制整数后为15691和20024。按照sscanf()指定的格式输入15691 20024后,回车。

(其实,数值转换这个过程是应付老师的hh,我的做法是通过gdb调试直接查找寄存器地址内容~,由于我有一个小伙伴将这一部分解释的超级详细,下面我附上我的大概解题思路和张大大同学的博客,供大家参考 偷懒 ~~hhh)

通过在phase_1设置断点,运行到phase_1后先随意输入两个整数:123 345
二进制炸弹--拆弹实验_第5张图片
跟踪到低字节整数为:15691;
二进制炸弹--拆弹实验_第6张图片
跟踪到高字节整数为:20024;在找出答案过程中,所用指令有:break phase_1;run;stepi;disas;info registers;
二进制炸弹--拆弹实验_第7张图片第一关就到这啦~我们继续

https://blog.csdn.net/weixin_45809643/article/details/106875783?utm_source=app (张大大的记录哦~)

实验三. 循环
phase_2
二进制炸弹--拆弹实验_第8张图片
二进制炸弹--拆弹实验_第9张图片
通过对源代码的分析,找到了它的循环条件和循环体,对其进行运算: number[i]=number[i-2]/2+number[i-1] 又知,初始数字为 0x11=17和0x23=35 即
number[0]=17,number[1]=35。
number[2]=(17/2) + 35 = 43;
number[3]=(35/2) + 43 = 60;
number[4]=(43/2) + 60 = 81;
number[5]=(60/2) + 81 = 111;

二进制炸弹--拆弹实验_第10张图片

这一关我所遇到的循环体给大家总结了一下,需要注意的是一定先要找到输入数字的个数和第一个数值(有时候给的是前两个,比如我的这个)下面是我遇到的循环:
1.number[i+1]=number[i]/2+1
2.number[i]=number[i-1]-2*i+1
3.number[i]=number[i-2]/2+number[i-1]
好像就这些嘤嘤嘤~ 过了过了…

实验四. 条件/分支
phase_3
二进制炸弹--拆弹实验_第11张图片
二进制炸弹--拆弹实验_第12张图片
在无法获得源程序的情况下,只能通过对可执行程序进行反汇编来获得程序的汇编代 码。观察 bomb.s 对应的汇编代码,分析源程序的功能。
在这里插入图片描述
(有些只需要输入 %d %d 俩个整数)
结合源代码可以发现,程序内部对将要输入的第一个数字的要求是减去 45 后的值小于 7,第二个输入应该根据第一个输入的整数的值来判断程序转到哪个分支执行,从而确 定第二个数字的值应该输入哪个。 假设输入值为 45,然后通过计算在 gdb 中查看表基址。

二进制炸弹--拆弹实验_第13张图片
得到基址后返回在 bomb.s 中查看跳转通过计算转换得到后两个应输入e和142。
(注意看好自己的跳转!~)

二进制炸弹--拆弹实验_第14张图片

实验五. 递归调用和栈
phase_4
二进制炸弹--拆弹实验_第15张图片
二进制炸弹--拆弹实验_第16张图片
得到的递归条件为:
二进制炸弹--拆弹实验_第17张图片这一关,我做的是寂寞呀,感觉什么都没给大家解释清楚,其实~我是用 ida转换成伪代码从而找到递归条件的,实在是看不懂汇编代码了 )

二进制炸弹--拆弹实验_第18张图片
继续吧,艰难的旅途…

实验六. 指针
二进制炸弹--拆弹实验_第19张图片
二进制炸弹--拆弹实验_第20张图片
这个过程用了一个双循环,其主要条件就是与0xf按位与,通过找其他资料发现了明地址的作用,于是我找到了0x804d220这个地址,用gdb调试
二进制炸弹--拆弹实验_第21张图片
二进制炸弹--拆弹实验_第22张图片
二进制炸弹--拆弹实验_第23张图片

实验七.链表
phase_6
二进制炸弹--拆弹实验_第24张图片
二进制炸弹--拆弹实验_第25张图片
在此关中,我的代码发现最终输出的结果是按照降序排列数字然后输出:(有的是升序,有的需要用9减有的不需要)
二进制炸弹--拆弹实验_第26张图片
降序排列为:1 5 8 7 4 3 6 2,用9减去之后为: 8 4 1 2 5 6 3 7
二进制炸弹--拆弹实验_第27张图片
到这里,正式关卡已经结束,最后一关为隐藏关,主要就是先要找到通关密码:
二进制炸弹--拆弹实验_第28张图片
二进制炸弹--拆弹实验_第29张图片
二进制炸弹--拆弹实验_第30张图片
二进制炸弹--拆弹实验_第31张图片
对隐藏关中的汇编进行分析,然后再通过 gdb 查看0804b2e2中得内容,最终可得知隐藏关 的入口在 phase_4,密码为”Rsaidfo”
二进制炸弹--拆弹实验_第32张图片
在这里插入图片描述
呼~密码找到了,此时又是想偷懒的刘渣渣,具体破解方法我的隐藏关和张大大完全相同,哈哈哈,不厚道的附上链接
链接: link.

真省事呦呼呼,
结束啦~~

你可能感兴趣的:(反汇编)