CSAPP Lab2: binary bomb 二进制炸弹

实验技能

拆弹准备:

☞熟练使用gdb调试器和objdump;
☞单步跟踪调试每一阶段的机器代码;
☞理解汇编语言代码的行为或作用;
☞“推断”拆除炸弹所需的目标字符串。
☞在各阶段的开始代码前和引爆炸弹函数前设置断点,便于调试。

实验语言:

C语言,AT&T汇编语言

实验环境:

32位 linux

实验介绍:

逆向工程拆除“二进制炸弹”程序
增强对程序机器级表示、汇编语言、调试器和逆向工程等理解。
一个“Binary Bombs”(二进制炸弹,简称炸弹)是一个Linux可执行C程序,包含phase1~phase6共6个阶段。
炸弹运行各阶段要求输入一个字符串,若输入符合程序预期,该阶段炸弹被“拆除”,否则“爆炸” 。
你需要拆除尽可能多的炸弹。

每个炸弹阶段考察机器级语言程序不同方面,难度递增
阶段1:字符串比较
阶段2:循环
阶段3:条件/分支:含switch语句
阶段4:递归调用和栈
阶段5:指针
阶段6:链表/指针/结构
隐藏阶段,第4阶段之后附加特定字符串后出现

预备

反汇编:
objdump -d bomb > +文件名
生成一个反汇编的txt文件

phase_1

在这里插入图片描述
我们可以看到<+18>这行,-0x1ebc(%ebx),%eax,而且在后面的eax压栈,0x8($ebp)也压栈,然后call函数进行字符串比较,则此时我们可以打印-0x1ebc(%ebx)或%eax查看
在这里插入图片描述
所以答案就是“Wow! Brazil is big.”

phase_2

在这里插入图片描述
在<+27>可以看到要读取6个数字
在<+35>得知我们输入的第一个数和0比较且等于0,
<+41>可知第二个数要和1比较且等于1
<+52><+55>得知第1个数赋值给了esi,第5个数赋值给了edi,
之后到了<+72>以此向下读取一个数给eax,并与esi相加赋值给eax,在与下一个数比较,相等就跳转到<+65>,esi到了第2个,与第5个比较,判断是否退出循环。
由此可知第3个数等于它前面两个数之和。
所以答案得到0 1 1 2 3 5

phase_3

在这里插入图片描述
<+36>可以看出我们需要输入
在这里插入图片描述
则我们要输入两个数
<+47>和<+49>可以得知第一个数在1到7之间。
我们可以输入2
在这里插入图片描述
这一步中通过使用i r可以看出,我们的第二个数为159
在这里插入图片描述
所以得到结果为2,159

phase_4

在这里插入图片描述
同理,在<+36>可以看到我们需要输入
在这里插入图片描述
打印eax可知我们要输入两个数
<+49>可知我们的第一个数应该小于等于14
然后<+70>行,调用了fun4,其中我们的第一个数带入其中计算,然后计算出来的值在<+78>可知,应该等于7
对应结果如下
在这里插入图片描述
所以我们选择14作为我们的第一个数
<+83>则可以看出我们的第2个数为7
所以结果为14,7

phase_5

在这里插入图片描述

同理,通过代码看出也是输入
打印eax得知需要两个数
在这里插入图片描述
而且第一个数应该不等于15
在这里插入图片描述
这是一个小循环,循环一次,edx就加1,edx的初始值是0,则我们需要循环15次
可以得到如下的值
在这里插入图片描述
我们第一个5可以满足这个循环的要求。
<+105>中,我们的第二个数和ecx比较,且要相等
则打印出ecx的值
在这里插入图片描述
所以得到第2个值为115
答案为5,115

phase_6

在这里插入图片描述
观察看到<+27>要我们输入六个数字,而且
在这里插入图片描述
加上这几行可以得知输入的数减1不得大于5
在这里插入图片描述
则我们的初始值可以输入1,2,3,4,5,6
从这可以看出我们的数被7减
在这里插入图片描述
根据对应的链表由大到小排序为0x388,0x324,xc7,0xa9,0x7c,0x36
可以排序6,1,3,2,4,5
因为这些数被7减,所以结果为1,6,4,5,3,2

隐藏阶段:

在phase_defused中的第四阶段有个隐藏的字符串
在这里插入图片描述
通过查找得到隐藏字符串
在这里插入图片描述
然后把“DrEvil”放到第四个答案后面即可进入我们的隐藏炸弹
在这里插入图片描述
进入secret_phase
在这里插入图片描述
从这可以得知我们输入的数经过fun7后要等于2

通过观察func7内的语句可知,该函数的核心部分是递归。且该递归函数的方式为
在这里插入图片描述
由此格式可知我们要用第一个得到偶数2
根据计算得应为22
在这里插入图片描述

实验结果:

在这里插入图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值