BUPT CS:APP lab2 拆解二进制炸弹

本文使用了GDB进行拆弹,前期准备工作不再赘述,直接进入拆弹环节。

 Phase_1

  对phase_1的代码反汇编后查看,阅读代码可发现有参数传入寄存器%esi,用x/s指令查看此处地址中的值,即可得phase_1的答案。

Phase_2

反汇编phase_2,阅读代码发现函数<read_six_numbers>,查看此函数,打印相应寄存器中的值,发现是6个 %d,说明需要输入6个数字;回到phase_2,发现函数返回后和1进行比较,说明6个数字第一个是1,继续阅读发现下面寄存器 %eax加倍,然后判断相等,再循环;由加倍可得后一个数是前一个数的2倍,于是可推得答案为1 2 4 8 16 32。

Phase_3

反汇编phase_3的代码,先查看寄存器%esi的值,发现是两个 %d,说明输入是两个整数;继续阅读发现第一个参数必须小于7,再往后发现  jmpq *0x4026e0(,%rax,8)语句,此语句是典型的switch语句,跳转表的基地址是0x4026e0,查看基地址:

即从<phase_3+64>行开始阅读,代表输入参数为0时,switch应该执行的支路;阅读可得结果应该是 %eax=38-298+38d-20d+20d-20d+20d-20d,即是十进制的-224;可得答案为 0 -224(答案不唯一).

Phase_4

反汇编phase_4的代码,查看寄存器 %esi 的值,发现是两个 %d,即需要输入两个整数;继续阅读发现调用了函数<func4>,传入参数为5和输入的第二个值;查看函数,发现是一个递归函数,分析可写出其对应的C代码,然后假定输入的值为4,运行程序可得到结果为48;则可得答案为 48 4。

 

Phase_5

反汇编此段代码,阅读发现调用了<string_length>函数,且返回值与6比较,说明需要输入长度为6的字符串;然后查看寄存器和特殊地址里的值,发现存在两个字符串,这应该是问题的突破口;

接下来分析代码中的循环,分析可知其对输入的字符串和已有的模式串进行了截断与比较,且循环了六次,参照查看的字符串“sabres”可推断出该部分代码是找到“sabres”字符串中的每个字符在“maduiersnfotvbyl”字符串中第一次出现的位置,比较可得依次为 7 1 13 6 5 7;也就是说我们输入的字符串应该是以这6个数字中的每一个数字作低四位,高四位任取;通过查ASCII表可知,输入字符应该为71=657(答案不唯一)。

 

Phase_6

此段代码过长,分段阅读:

  开始先调用函数<read_six_numbers>,读取六个整数,然后判断每个数是否小于等于6且每个数是否各不相同;汇编代码及对应C代码如下;

② 继续阅读发现又进入一个循环,仔细分析可发现其在147行创建了一个链表,然后在循环内按照输入序列进行排序;

③ ​​​​​​​ 接着发现进行了构造链表并且又是一个循环,仔细分析可发现其对链表进行了排序,且是按照输入序列进行排序,并且最后判断是排序前链表是否为降序排列;

④ ​​​​​​​因此我们只需检测0x6042f0之后步长为8的链表的值,然后对其进行降序排序,即可得到答案 5 3 2 4 6 1。

 

Phase_secret

来到隐藏关卡,重新审视 .C文件发现只有一个函数 <phase_defused> 还没有研究过,反汇编它,查看寄存器的值,发现DrEvil亲切友好的问候:

且有一个寄存器的值是这样:

说明需要输入两个数字加一个字符串才能进入隐藏关卡,回顾已完成的关卡,发现第四关是输入了两个数字,意识到此处为关卡入口,而入口密钥就是DrEvil!

继续阅读发现了隐藏函数入口:

反汇编此函数,打开了新世界:

先查看函数<strtol>,查阅相关资料可知该函数的输出为十进制;

接下来发现<fun7>函数,检查寄存器的值发现传入此函数的值为0x24,函数返回结果为5;

反汇编fun7函数,又是一片新世界:

仔细分析可得出

因为我们要返回结果5,所以返回顺序是④ -> ③ -> ② -> ③;

即调用顺序是③ -> ② -> ③ -> ④;

传入fun7的一个参数是之前得到的0x24,另一个是应该我们输入的;

逐级推到,得出答案:0x2f,即十进制的47。

(8)输入所有答案,炸弹拆解完毕!

Good luck!: -)

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值