二进制炸弹
花了一天工夫完成了二进制炸弹;又花了一天工夫写完了实验报告,真的是痛并快乐着吧(嘿嘿)
实验内容
二进制炸弹是作为一个目标代码文件提供给学生们的程序,运行时,它提示用户输入6个不同的字符串。如果其中任何一个不正确,炸弹就会“爆炸”:打印出一条错误信息。学生通过反汇编和逆向工程来确定是哪六个字符串,从而解除他们各自炸弹的雷管。
该作业需要有比较好的汇编语言阅读能力,涉及理论课第3章的所有知识内容。
前序步骤 :
1、 反编译bomb并打开bomb.txt文件进行搜索:
2、 通过【查找】功能查找主程序并找到第一次读取键盘输入:
3、 在程序中记录下每一个phase函数的起始位置,在调用每一个phase前设置断点,并在explode_bomb也设置断点,防止在gdb中调试时爆炸:
注释:进入程序后加载两句话,随后先输入任意内容执行程序
4、 解读main主程序中关于phase_1程序的上下文
一、Phase_1:
(1)【查找】phase_1的汇编代码,并理解语句
解答此题关键在于理解<strings_not_equal>函数以及0x8048de4到0x8048de8之间的代码
(2)很明显,strings_not_equal函数判断字符串是否相等;而0x8048de40x8048de8在R【eax】中内容相等时跳转到phase_1+0x22的位置,否则爆炸,因此重点是验证phase_1的栈帧:
查完寄存器内容可知,在0x804b4e0处存储了我们输入的字符串,那么在0x804a229处便存储了需要比较的字符串,调用操作查看其中内容知其值为 ” Crikey! I have lost my mojo!”
运行一遍查看是否能通过:
-----------------------------------------------------------------------------------------
二、phase_2:
(1)查看phase_2的汇编语言,并将其大致分块【“判断”的重点主要为红色下划线处、橙色和红色方框处】
(2)第一个重点为<read_six_number>处,通过查阅汇编代码,得知其目的为:读入并确认读入的数字是否为六个整数,若是则通过,否之则爆炸
(3)第二个重点为黄框处
:cmpl $0x0 0xffffffe0(%ebp) 将我们输入的第一个数与0比较,如果jns【即为非负数】则跳转到0x8048d42,否则爆炸, 说明读入的第一个数为非负数,我选择数字0
(4)最重要的是第三个重点 红色方框处
:
分析代码知,