给出对应于7个阶段的7篇博客

phase_1  https://www.cnblogs.com/wkfvawl/p/10632044.html
phase_2  https://www.cnblogs.com/wkfvawl/p/10636214.html
phase_3  https://www.cnblogs.com/wkfvawl/p/10651205.html
phase_4  https://www.cnblogs.com/wkfvawl/p/10672680.html
phase_5  https://www.cnblogs.com/wkfvawl/p/10703941.html
phase_6  https://www.cnblogs.com/wkfvawl/p/10742405.html
secret_phase  https://www.cnblogs.com/wkfvawl/p/10745307.html

phase_5

phase_5要求输入一个包含6个字符的字符串。phase_5函数从中读取这些信息,并判断其正确性,如果不正确,则炸弹爆炸。

phase_5主要考察学生对指针(数组)机器级表示的掌握程度。

观察框架源文件bomb.c:

从上可以看出:

1、首先调用了read_line()函数,用于输入炸弹秘钥,输入放置在char* input中。

2、调用phase_5函数,输入参数即为input,可以初步判断,phase_5函数将输入的input字符串作为参数。

因此下一步的主要任务是从asm.txt中查找在哪个地方调用了readline函数以及phase_5函数。

1.1 寻找并分析调用phase_5函数的代码

打开asm.txt,寻找phase_5函数。

和phase_1类似分析:

1、当前栈的位置存放的是read_line函数读入的一串输入;

2、phase_5的函数入口地址为0x8048df7

此时的函数栈为:

1.2 phase_5函数分析

继续寻找phase_5,或搜索8048df7,可以找到phase_5函数入口。如下图所示:

1、541-547行:初始化函数栈帧,并为调用string_length做准备(此时ebx的内容为input字符串首地址:543行)。函数栈帧如下图所示:

注:

1)544-545行:mov %gs:0x14, %eax   mov %eax, 0x1c(%esp),将gs(全局段寄存器)+0x14偏移位置的内容放置到eax,然后将其放置到esp + 0x1c的地方。从这里看不出这段代码什么含义,但据后面的分析,这里应该是起到一个“哨兵”的作用,防止数组访问越界。

2)546行:xor %eax, %eax,似乎没有什么用,得出来的结果是0,应该只是影响zf标志寄存器(zf为零标志寄存器,即zf=1)。

2、548行:判断input字符串的长度(esp指向的地方为input的首地址,参见上图),返回结果在eax寄存器中。

3、549-551行:判断input的长度是否为6,如果不是,则炸弹爆炸(551行),如果是,跳转到8048e62<phase_5+0x6b>。也即输入的字符串长度应该是6。

4、572-573行(8048e62<phase_5+0x6b>):将eax寄存器内容赋值为0,然后跳转到8048e22<phase_5+0x2b>。

5、554行(<8048e22><phase_5+0x2b>):将ebx + eax * 1地址的内容送入到edx。注意, ebx为input首地址,也即将input[%eax]的内容送入到edx。当eax = 0时,即为edx的内容为input[0]。

6、555行:将edx的内容(input[0])与0x0f位与,相当于取低4位(edx内容为input[eax]的低四位)。

7、556行:将edx + 0x804a470指向的地址的内容送入到edx。0x804a470的内容(使用objdump --start-address=0x804a470  -s bomb,参见phase_1分析过程)为:

从上面来看,0x804a470应该是指向一个字符串,此时edx的内容应该是0x804a470加上input[eax]低4位的偏移的内容。

8、557行:将dl(edx的低8位,为(0x804a470 +input[eax]) & 0xf)的内容送入到esp + eax * 1 + 0x15的地方。

9、558-560行:eax += 1,然后判断eax的内容是否等于6,如果不等,则跳转到8048e22<phase_5+0x2b>,重新回到第5步继续进行分析,直到eax=6(即循环6次)。

10、以上代码,以类c语言来简要说明:

for(int i = 0; i < 6; i++){

//将0x804a470 +  input[i] & 0x0f这个地址的内容送入到堆栈esp + i + 0x15地址中。

(0x804a470 +  input[i] & 0x0f)  --> (esp + i + 0x15)

}

经过6次循环后,函数栈帧如下:

显然,从esb + 0x15开始,是根据input的输入的每个字符的低四位,得出来的一个新的字符串。

11、561行:以上循环结束后,跳出循环,执行该语句:esp + 0x1b的内容改变为0;

12、562行:将0x804a446送入到:esp+0x4。0x804a446的内容为(objdump --start-address=0x804a446 -s bomb):

也即当前esp+0x4指向的是一个字符串首地址,字符串为“sabres”

13、564-565行:eax的内容变为esp + 0x15,即通过上面循环形成的新的字符串的首地址,然后将其送入到esp。

14、调用strings_not_equal函数,显然,前面11~13均在为调用strings_not_equal做准备,调用strings_not_equal前,函数栈帧为:

15、显然,strings_not_equal函数判断以(esp + 0x15)为首地址的字符串与0x804a446为首地址的字符串(sabres”)相比较,如相等,eax返回0,如不相等eax返回1。(参见phase_1分析)

16、567行:判断eax是否为0(eax与eax位与),如果为0,0标志寄存器为1。

17、568-569行:如果eax=0,则跳转到8048e69<phase_5+0x72>,后续直接退出phase_5了,说明输入的input字符串是正确的,否则引爆炸弹。(8048e69<phase_5+0x72>代码后面分析)

18、574-577行:将esp + 0x1c地址处的内容送入到eax(574行,esp+0x1c的内容应为%gs:0x14的内容),然后与%gs:0x14的内容相异或,如果相等(为0),则跳转到0x8048e7b,正常结束,否则调用__stack_chk_fail函数(应该是栈检查失败);

根据上面分析,%gs:0x14的值送入到esp+0x1c的地方(第544-545行),应该是起到一个“哨兵”的作用,防止数组的访问越界。

1.3 phase_5结果分析

根据前面分析,显然phase_5函数的作用(以类C语言进行描述):

char array[] = {'m','a','d','u','i','e','r','s','n','f','o','t','v','b','y','l'};
char *str = "sabres";
char  new_str[7];
//根据input的每个字符的低4位,以及array,形成新的字符串。
for(int i = 0; i < 6; i ++)
{new_str[i] = array[input[i]&0xf]);
}
new_str[6] ='\0';
//如果new_str不等于str("sabres"),则引爆炸弹。
if(strcmp(str, new_str) !=0)
{explode_bomb();
}

那么根据上面的代码反推,如果需要使构成的new_str=="sabres",那么输入的input[i]的低4位对应的十进制数分别是array[]数组中字符's','a','b','r','e','s'的下标。

根据以上分析,要形成"sabres"字符串:

array[] = {'m', 'a', 'd', 'u', 'i', 'e', 'r', 's', 'n', 'f', 'o', 't', 'v', 'b', 'y', 'l '};

1)'s':对应于array第7个 (从0开始),也即input[0]的低4位应该为7,符合条件的可显示字符有:''','7 ','G','W','g','w'(参见附后的ASCII码表):

2)'a':对应于array第1个 (从0开始),也即input[1]的低4位应该为2,符合条件的可显示字符有:'!','1 ','A','Q',a','q'

3)'b':对应于array第13个(从0开始),也即input[2]的低4位应该为13,符合条件的可显示字符有:'-','=','M',']','m', '}'

4)'r':对应于array第6个 (从0开始),也即input[3]的低4位应该为6,符合条件的可显示字符有:'&','6 ','F','V','f','v'

5)'e':对应于array第5个 (从0开始),也即input[4]的低4位应该为5,符合条件的可显示字符有:'%','5','E','U','e','u'

6)'s':对应于array第7个 (从0开始),也即input[5]的低4位应该为7,符合条件的可显示字符有:''','7 ','G','W','g','w'

因此,对于本题,答案不是唯一的,为6组可选字符的排列组合,如"gamfeg"、"GAMFEG"等。

转载于:https://www.cnblogs.com/wkfvawl/p/10703941.html

CSAPP lab2 二进制拆弹 binary bombs phase_5相关推荐

  1. CSAPP lab2 二进制拆弹 binary bombs phase_6

    给出对应于7个阶段的7篇博客 phase_1  https://www.cnblogs.com/wkfvawl/p/10632044.html phase_2  https://www.cnblogs ...

  2. [逆向工程] 二进制拆弹Binary Bombs 快乐拆弹 详解

    二进制拆弹 binary bombs 教你最快速解题,成功拆弹 最近计算机基础课,的实验lab2,二进制拆弹,可以说是拆的我很快乐了(sub n, %hair) 此处头发减n 我刚开始做的时候很是懵逼 ...

  3. CSAPP LAB Binary bombs实验报告

    CSAPP LAB Binary bombs实验报告 文章目录 CSAPP LAB Binary bombs实验报告 更好的阅读体验 一.实验目的: 二.实验要求 三.实验内容(所修改函数代码,功能以 ...

  4. CSAPP Lab2 实验记录 ---- Bomb Lab(Phase 1 - Phase 6详细解答 + Secret Phase彩蛋解析)

    文章目录 Lab 总结博客链接 实验前提引子 实验需要指令及准备 Phase 1 Phase 2 Phase 3 Phase 4 Phase 5 Phase 6 Phase Secret(彩蛋Phas ...

  5. 二进制拆弹实验详解linux,拆解二进制炸弹

    拆解二进制炸弹 一.实验目的 1.理解C语言程序的机器级表示. 2.初步掌握GDB调试器的用法. 3.阅读C编译器生成的x86-64机器代码,理解不同控制结构生成的基本指令模式,过程的实现. 二. 实 ...

  6. ICS lab2: Defusing a Binary Bomb

    ICS lab2: Defusing a Binary Bomb lab2的要求 工具准备:GDB,objdump GDB:Gnu DeBugger objdump:OBJect-file DUMP ...

  7. MySQL 二进制日志(Binary Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分. MySQL有几种不同的日志文件.通常包括错误日志文件,二进制日志,通用日志,慢查询日志,等等.这些日志能够帮助我们定位mysqld ...

  8. 数据库binlog(二进制日志binary log)

    二进制日志中存储的内容称之为事件,每一个数据库更新操作(Insert.Update.Delete,不包括Select)等都对应一个事件. mysql binlog基本原理 - 简书 (jianshu. ...

  9. 逻辑航线信息学系列教程:二进制(Binary)

    逻辑航线信息学系列教程 二进制(Binary)         二进制是计算技术中广泛采用的一种数制,是现代计算机的运算基础. 计算机仅仅能识别 "0" 和 "1&quo ...

  10. 二进制拆弹(炸弹炸掉了我的头发 T.T)

    文章目录 所需要使用的调试工具 开始进入拆弹过程 phase_1 phase_2 pahse_3 phase_4 phase_5 phase_6 secret_phase 所需要使用的调试工具 1. ...

最新文章

  1. 华为,你终于活成了他们害怕的样子
  2. Windows SharePoint Services 3.0 Step By Step翻译
  3. SideFX Houdini FX中文版
  4. 141 springmvc中 转发 与 重定向
  5. python opencv-4.1.0 cv2.getTextSize()函数 (计算文本字符串的宽度和高度)
  6. Graphviz安装配置及入门(windows安装亲测)
  7. 涨疯了,历史总是如此相似
  8. iPhone 11全球供应紧张:何时补货未知
  9. 这7本O’Reilly推出的免费Python电子书,够你看了
  10. Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定
  11. 中国电子技术标准化研究院与Linux基金会战略合作签约仪式圆满落幕
  12. 0基础学java可行吗_上海0基础学JAVA可行吗?
  13. 如何去掉字符串中第一个和最后一个字符 比如是;
  14. AMD GPU任务调度(2)—— 内核态分析
  15. Banner框架实现图片轮播
  16. 搭建个人博客【搭建Hexo+Fluid博客并部署到GitHub/云服务器(阿里云/腾讯云)】
  17. 目前为止最全的微信小程序项目实例 --- demo锦集
  18. git更换用户名和密码
  19. 上交所几大业务平台简介
  20. 饭店点餐系统之数据库表结构

热门文章

  1. 【linux内核分析与应用-陈莉君】动手实践--内核多任务并发实例
  2. 光环JAVA_【- Light 计划 -】新建了一台Linux云服务器我该干嘛
  3. (一百二十三)Android O 了解wifi eap中的anonymous identity
  4. oracle的mins,分钟的英文缩写,10min还是10mins!
  5. 微信网页扫码登录的实现
  6. 三国史诗——三国官制(一)
  7. 网上疯传河南高考零分作文:兔子 你傻啊?!
  8. 中国消费品领域知名的调查研究咨询公司信息
  9. 别错过这张AI商用清单:你的生产难题可能被一个应用解决!
  10. 培养学生数学核心素养,不能制造“数学小糊涂”!