二进制炸弹--拆弹实验

二进制炸弹–拆弹实验

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

那,我们就出发吧~

大作业要求

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

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

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

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

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

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

通过在phase_1设置断点,运行到phase_1后先随意输入两个整数:123 345
在这里插入图片描述
跟踪到低字节整数为:15691;
在这里插入图片描述
跟踪到高字节整数为:20024;在找出答案过程中,所用指令有:break phase_1;run;stepi;disas;info registers;
在这里插入图片描述第一关就到这啦~我们继续

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

实验三. 循环
phase_2
在这里插入图片描述
在这里插入图片描述
通过对源代码的分析,找到了它的循环条件和循环体,对其进行运算: 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;

在这里插入图片描述

这一关我所遇到的循环体给大家总结了一下,需要注意的是一定先要找到输入数字的个数和第一个数值(有时候给的是前两个,比如我的这个)下面是我遇到的循环:
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
在这里插入图片描述
在这里插入图片描述
在无法获得源程序的情况下,只能通过对可执行程序进行反汇编来获得程序的汇编代 码。观察 bomb.s 对应的汇编代码,分析源程序的功能。
在这里插入图片描述
(有些只需要输入 %d %d 俩个整数)
结合源代码可以发现,程序内部对将要输入的第一个数字的要求是减去 45 后的值小于 7,第二个输入应该根据第一个输入的整数的值来判断程序转到哪个分支执行,从而确 定第二个数字的值应该输入哪个。 假设输入值为 45,然后通过计算在 gdb 中查看表基址。

在这里插入图片描述
得到基址后返回在 bomb.s 中查看跳转通过计算转换得到后两个应输入e和142。
(注意看好自己的跳转!~)

在这里插入图片描述

实验五. 递归调用和栈
phase_4
在这里插入图片描述
在这里插入图片描述
得到的递归条件为:
在这里插入图片描述这一关,我做的是寂寞呀,感觉什么都没给大家解释清楚,其实~我是用 ida转换成伪代码从而找到递归条件的,实在是看不懂汇编代码了 )

在这里插入图片描述
继续吧,艰难的旅途…

实验六. 指针
在这里插入图片描述
在这里插入图片描述
这个过程用了一个双循环,其主要条件就是与0xf按位与,通过找其他资料发现了明地址的作用,于是我找到了0x804d220这个地址,用gdb调试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

  • 33
    点赞
  • 208
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值