计算机系统——bomb炸弹实验详解

炸弹的运行机制:由read_line获取输入得到input,然后再将input传递给phase_1等函数,然后执行phase_1,如果执行正确,则拆弹成功,进入phase_2.以此类推直达拆弹结束。

阶段1:字符串比较
打开反汇编形成的txt文件,定位到phase_1函数处
在这里插入图片描述
然后调出命令行首先设置断点b phase_1,并运行程序。
然后根据提示,输入第一关的密码。随便输入一个字符:abc
首先进行汇编代码的分析,首先是rsp指针向下移,创造了一个更大的空间,然后将0x15ed(%rip)地址的值传递到%rsi的位置,之后调用函数string_not_equaled判断字符串是否相等,如果字符串相等则返回值是0,拆弹成功,否则BOMB!!!
由此可以大胆猜测要输入的应该是0x15ed(%rip)地址的值,输入gdb bomb 进入调试状态,使用x/s $rsi查看该地址的内容,回车显示处字符串“Wow! Brazil is big.”,

在这里插入图片描述
验证:设置断点b phase_1,输入run运行,进入程序,在输入提示的下一行输入“Wow! Brazil is big.”,终端显示“Phase 1 defused. How about the next one?”,第一关顺利通过。
在这里插入图片描述

阶段2:for循环
在这里插入图片描述分析:首先很容易观察到在phase_2中存在对于函数<read_six_number>的调用,通过分析可知第二关需要输入六个正确的数字,数字怎么推算出来就需要看下面的汇编代码了。
js 1252 <phase_2+0x2e> 是比较%rsp与0,如果%rsp不为负则跳转,如果为负则会引发炸弹。%rsp是我们需要输入的第一个数,推测得知这里需要输入一个非负数,这里我按照了自己的喜好选择了喜欢的0,然后跳转到一个循环,第二个数到第六个数都由循环推测出。首先将eax与ebx置1,随后的关键指令是add -0x4(%rbp,%rbx,4),%eax与cmp %eax,0x0(%rbp,%rbx,4),判断当前输入的数与上一个数+当前%eax的值是否相等,不等就会触发炸弹。随后$rbx加1,继续循环,直到不满足循环条件.
设几个数为num[1]-num[6],其中num[1]为非负数,num[2]至num[6]的规律可以用以下等式来概括:num[n]=num[n-1]+n-1
验证:终端输入“0 1 3 6 10 15”显示“That’s number 2. Keep going!”第二关成功通过。
在这里插入图片描述

阶段3:switch分支
在这里插入图片描述
调用__isoc99_sscanf@plt后,eax=输入的数字个数,cmp$0x1,%eax jle 12dc <phase_3+0x4a>这段代码表示如果eax<=1则爆炸,则输入的数字个数需要大于1。
p/x $eax $eax=2,输入两个数顺利通过。这里输入4 0.
在这里插入图片描述

b*(0x8048e23) 这里将rsp和7进行了比较,需要rsp<=7.而这里的rsp就是第一个输入值,则第一个输入值要小于或等于7。
p/x $eax发现eax等于输入的第一个数字4,
而后在cmpl $0x5,(%rsp)将(%rsp)与5进行比较,而(%rsp)中存放的是第一个输入A,如果rsp>5就爆炸,所以第一个输入值<=5。
而后将经过运算后得到的后得到的eax,与0x4(rsp)进行比较,而这里的0x4(rsp)的值就是我们第二个输入的值,所以这里需要让第二个输入的值等于eax,即可通过。
在这里插入图片描述

阶段4:递归函数
在这里插入图片描述

由cmp $0x2,%eax ,jne 13da <phase_4+0x33>可以看出,如果eax不等于2则爆炸,而eax则是我们输入的数字个数,说明该题要有俩个输入值。
Cmpl $0xe,(%rsp) , jbe 13df <phase_4+0x38> 则可以看出,如果rsp不高于则跳转,说明输入的第一个数字要小于等于14,否则爆炸。
跳转后进入fun4函数进行运算后,由cmp $0x2d,%eax可知比较返回值eax与0x2d是否相等,如果不相等则boom
由此我们可知道关键点就在fun4里面,当输入14时返回值为0x2d。
在这里插入图片描述

由cmpl $0x2d,0x4(%rsp)可知我们第二个的输入值要等于0x2d,否则无法通过,所以该题答案为14 45
在这里插入图片描述

阶段5:数组元素按序访问
在这里插入图片描述

由cmp $0x6,%rax可知,若rax不等于6则爆炸,而rax则是输入的字符的个数,由此我们需要输入六个字符,此处先输入abcdef
当看到lea 0x13f6(%rip),%rcx时,感觉不知道为什么要传送目标地址,便查看了rcx的值,
在这里插入图片描述

可以看到maduiersnfotvbyl后跟了一串文字,告诉我们找到了解题关键。
在这里插入图片描述

由lea 0x1(%rsp),%rdi lea 0x139c(%rip),%rsi则查看rdx的值,观察两两对应关系,只需要可以发现“sabres”在其中的顺序为”7,1,13,6,5,7”, 说明输入字符串中对应位的字符的最低4位的数值等于"7,1,D,6,5,7",即可通过这一关。查看ASCII值,得到gamfeg
在这里插入图片描述

阶段6:链表
在这里插入图片描述
在这里插入图片描述

sub $0x1,%eax cmp $0x5,%eax ja 14d3 <phase_6+0x2d> 说明输入要小于6所以需要输入6个小于6的数字,sub $0x1,%eax cmp $0x5,%eax说明要输入6个小于6大于0的数字,综上,要输入六个大于0且小于6的6个数字
lea 0x202cd1(%rip),%rdx 这里将0x202cd1(%rip)地址里的内容赋值给%rdx,所以我们可以“x/50w 0x555555758110”将从地址0x555555758110开始的50句打印出来,输出的内容依然看不懂,于是参考了资料,发现这里的地址原来是一个链表的指针,查看列表内容,结果如下图所示。
在这里插入图片描述

因为0x555555758110是链表的下一个节点,5的下一个节点就是这个0x555555758110,所以我们可以用 x/50w 0x555555758110查出下一个节点的存储。
在这里插入图片描述

四个数一组,第一个数是一个权值,第二个数按照123456排序下来,第三个数是下一个节点的首地址,按照从小到大的顺序排列后,6 5 1 2 4 3即为该题答案
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值