当前位置:文档之家› Bomblab实验报告

Bomblab实验报告

Phase_1及其破解过程:
知识点:string,函数调用,栈
反汇编代码及其分析:
08048f61 <phase_1>:
8048f61:55push %ebp
//压栈 ebp为栈指针 esp为栈指针。
push指令可以理解为两个步骤:
1、 subl $4 , %esp–栈底向下移一位
2、 movl %ebp ,(%esp) 将ebp的值存入esp中
//test执行的就就是and的指令,不会保存and执行的结果,而就是根据and的结果设置flags寄存器的各种标志。
8048f7c:74 05je 8048f83 <phase_1+0x22>
//Je指令:当ZF等于零的时候跳转,也就就是相等的时候跳转。判断%eax就是否为0,为0跳转,不为0引爆
8048f7e:e8 4e 01 00 00call 80490d1 <explode_bomb>
8048f83:c9leave
//为结束函数做准备
8048f84:c3ret
//返回。ret:不带任何参数时,用于在子程序的结束位置,被调用的子程序必须有ret指令,否则调用没有ret指令的子程序会导致自陷,子程序执行完之后处于失控状态。带参数ret n 表示子程序返回主程序的同时,堆栈弹出n个字节(栈顶指针减n)
//调用字符串比较函数,string_not_equal就提示需要比较两个字符串,通过gcc函数调用规范知道压入堆栈的两个参数分别为输入字符串与程序内部字符串。<strings_not_equal>函数的时候,必须返回%eax为0,而这个函数的作用就就是判断字符串就是否相等。
8048f7a:85 c0test %eax,%eax
8048f6e:08
8048f6f:8b 45 08mov 0x8(%ebp),%eax
//取用户输入的内容存入%ebp
8048f72:89 04 24mov %eax,(%esp)
//eax的值赋值给*esp
8048f75:e8 31 00 00 00call 8048fab <strings_not_equal>
3、由于bomb、c文件并没有蕴含许多能破解的信息,所以需要将其进行反汇编,详细操作如下:
输入objdump–d bomb >bomb、txt将汇编代码输出到自动生成一个bomb、txt的文件里面,方便我们查瞧与分析代码:
二、具体实验步骤及其分析
试查瞧导出的bomb、txt,我发现总的文本里面分为很多段,其中就有Phase_1~Phase_6、Phase_defuse、Phase_secret以及其她相关函数的代码,所以我猜测每一段Phase代码就就是我们需要破解的关卡,所以我将它们分别导出新建text文件,逐段分析。
8048f62:89 e5mov %esp,%ebp
//把esp赋值给ebp
8048f64:83 ec 18sub $0x18,%esp
//esp指针下移0x18个字节
8048f67:c7 44 24 04 5c a1 04movl $0x804a15c,0x4(%esp)
//取0x804a15c处的内容存入*(%esp+4)
知识点:循环语句,数组
08048d6a <phase_2>:
8048d6a:55push %ebp
8048d6b:89 e5mov %esp,%ebp
8048d6d:56push %esi
8048d6e:53push %bx
8048d6f:83 ec 30sub $0x30,%esp
8048d72:8d 45 e0lea -0x20(%ebp),%eax
具体操作:
读取0x804a15c内存的字符串(密码),并设置断点。
成功读取到字符串,作为密码输入:
第一关成功破解
程序流程:
1、取内存地址0x8049a04处的内容;
2、取用户输入的内容(即密码);
3、比较两者的值,相等则%eax置为0,进入下一关,不相等则调用引爆程序引爆炸弹。
Phase_2及其破解过程:
实验步骤及体会
一、实验准备
1、首先,由于虚拟机操作系统与windows系统相互独立文件系统目录下的下载文件夹里面:
2、输入、/bomb试运行bomb、c文件时会提示权限不够:
所以需要输入chmod+x+文件名的命令于改变文件或目录的访问权限。用它控制文件或目录的访问权限。在经过操作之后,获得了权限,程序可以正常运行了:
8048d7c:89 04 24mov %eax,(%esp)
//前面几行均为初始化栈操作
8048d7f:e8 87 03 00 00call804910b <read_six_numbers>
//调用函数read_six_numbers(说明密码就是6个数字)
8048d84:83 7d e0 00cmpl $0x0,-0x20(%ebp)
//lea:取偏移地址将一个数的内存单元的偏移地址,送入寄存器中存储,与mov不同的就是mov就是将该数当作一个偏移地址存入寄存器,没有寻址的功能。
8048d75:89 44 24 04mov %eax,0x4(%esp)
//取用户输入的内容,存入%ebp
8048d79:8b 45 08mov 0x8(%ebp),%eax
//前一段总的分析:初始化栈,push就是压栈指令,ebp寄存器中的内容就是栈底指针。esp寄存器里面存的就是栈顶地址。通过sub指令,将栈顶固定在第十八个存储单元里面。字符串的内存地址为0804a15c,四个字节。一个存储单元存放8个bit两个十六进制数字,栈顶及后三个单元存栈顶地址。故用mov指令将字符串地址存在栈顶后的第四个字节处。
课程实验报告
课程名称:计算机系统原理实验
实验项目名称:BombLab
专业班级:计科1501
姓名:马子垚
学号:2
完成时间:2017年4月19日
实验目的
理解汇编语言,学会使用调试器
实验原理
二进制炸弹就是作为一个目标代码文件提供给学生们的程序,运行时,它提示用户输入6个不同的字符串。如果其中任何一个不正确,炸弹就会“爆炸”:打印出一条错误信息。学生通过反汇编与逆向工程来确定就是哪六个字符串,从而解除她们各自炸弹的雷管。
相关主题