(1)问题描述
本实验是解除二进制炸弹。给你一个二进制可执行文件,运行该文件,你需要在没有任何提示的情况下输入5个password,如果都输入正确,则炸弹被解除;如果输入错误,则炸弹爆炸。
(2)实验思路
就是通过二进制文件分析这个程序作了些什么。运用反汇编工具IDA ,分析这个程序实现了什么功能。
(3)闯关
第一关
第二关
第三关
第四关
call _phase_4
根据学号进入phase_4_24
调用递归函数_func4_2, 计算数的阶乘
发现ebx存放的是40320=8!
故密码是8*500=4000
第五关
输入指令后发现eax是计算输入的数字个数。2F6h是一个比较大的数(758)所以炸弹一般不会爆炸,跳转。
遇到一个_Is Debugger Present函数发现Step over就会爆,而Step into
一样会爆,无法避免。推测这就是提示中的“反调试”,此时我们不可能不用IDA Pro工具,恰恰相反是用到了它的修改ip的功能:
发现经过_Is Debugger Present, eax=1,无法跳转,会使得炸弹爆炸。
因此用set IP 跳过这里。
遇到 _tohex 根据名称推断是把我们的输入转成十六进制的指令。
然后又是随机生成一些密码指令。
接着遇到 _check_buf_valid 函数,step into, 研究发现是对输入做异或,把结果储存在eax,然后与edx作比较如果不相等,c1的值将被置零。
发现eax=4D,即输入的数异或和为4D。
继续step into _goto_buf_2,发现莫名其妙程序崩溃了。根据提示发现输入的指令很有可能是地址!
于是找到通关的程序段:推断出密码含有 D4 11 40 00
然后根据异或和为4D和其他的提示,找到答案为:B8 D4 11 40 00 50 C3 E3
最后成果:
用命令行执行: