当前位置: 首页 > news >正文

csapp深入理解计算机系统 bomb lab(1)phase_1

实验目的:进一步了解机器级代码,提高汇编语言、调试器和逆向工程等方面原理与技能的掌握。

实验环境:C、linux

实验获取:进入csapp官网,点击linux/x86-64 binary bomb下载实验压缩包。

实验说明:一共有6个关卡,每个关卡可以输入一串字符,只有输入正确才能拆出炸弹。

只有可执行程序,不知道六个关卡函数具体的代码都是什么。

可以应用反汇编技术把可执行程序转化为汇编程序。通过阅读汇编程序,推断出程序的具体作用,从而给出正确的密码输入。

​​​​​​s​​​​CS:APP3e, Bryant and O'Hallaron

解压:tar -xvf bomb.tar

从bomb.c可以看出phase_1接受一个输入,需要反汇编推测phase_1对input做了什么处理。

反汇编整个程序:

objdump -d bomb > bomb.txt

bomb.txt可以查看bomb的汇编代码

gdb进入调式模式

gdb bomb

在phase_1函数打断点

(gdb)break phase_1

运行到断点处

(gdb)run

可以看到断点在0x400ee0,从汇编文件中可以找到phase_1的汇编代码

此外,还可以在gdb中查看phase_1的汇编代码

disas phase_1

在使用 test %eax, %eax 指令后,通常会检查标志位,以确定 %eax 中的值是否为零。如果结果为零,则零标志位会被设置为 1,表示 %eax 中的值为零;如果结果不为零,则零标志位会被清除为 0,表示 %eax 中的值不为零。

如果%eax不为0,执行explode_bomb函数,所以只有当string_not_equal返回的值为0,才可以解开炸弹。

查看string_not_equal的汇编代码

0000000000401338 <strings_not_equal>:401338:	41 54                	push   %r1240133a:	55                   	push   %rbp40133b:	53                   	push   %rbx40133c:	48 89 fb             	mov    %rdi,%rbx40133f:	48 89 f5             	mov    %rsi,%rbp401342:	e8 d4 ff ff ff       	call   40131b <string_length>401347:	41 89 c4             	mov    %eax,%r12d40134a:	48 89 ef             	mov    %rbp,%rdi40134d:	e8 c9 ff ff ff       	call   40131b <string_length>401352:	ba 01 00 00 00       	mov    $0x1,%edx401357:	41 39 c4             	cmp    %eax,%r12d40135a:	75 3f                	jne    40139b <strings_not_equal+0x63>40135c:	0f b6 03             	movzbl (%rbx),%eax40135f:	84 c0                	test   %al,%al401361:	74 25                	je     401388 <strings_not_equal+0x50>401363:	3a 45 00             	cmp    0x0(%rbp),%al401366:	74 0a                	je     401372 <strings_not_equal+0x3a>401368:	eb 25                	jmp    40138f <strings_not_equal+0x57>40136a:	3a 45 00             	cmp    0x0(%rbp),%al40136d:	0f 1f 00             	nopl   (%rax)401370:	75 24                	jne    401396 <strings_not_equal+0x5e>401372:	48 83 c3 01          	add    $0x1,%rbx401376:	48 83 c5 01          	add    $0x1,%rbp40137a:	0f b6 03             	movzbl (%rbx),%eax40137d:	84 c0                	test   %al,%al40137f:	75 e9                	jne    40136a <strings_not_equal+0x32>401381:	ba 00 00 00 00       	mov    $0x0,%edx401386:	eb 13                	jmp    40139b <strings_not_equal+0x63>401388:	ba 00 00 00 00       	mov    $0x0,%edx40138d:	eb 0c                	jmp    40139b <strings_not_equal+0x63>40138f:	ba 01 00 00 00       	mov    $0x1,%edx401394:	eb 05                	jmp    40139b <strings_not_equal+0x63>401396:	ba 01 00 00 00       	mov    $0x1,%edx40139b:	89 d0                	mov    %edx,%eax40139d:	5b                   	pop    %rbx40139e:	5d                   	pop    %rbp40139f:	41 5c                	pop    %r124013a1:	c3                   	ret    
  1. 该函数保存了一些寄存器的值(%r12%rbp%rbx)并将参数传递到寄存器中(%rdi%rsi
  2. 两次调用 string_length 函数,分别计算了两个输入字符串的长度,将长度分别存储在 %r12d%eax 中。
  3. 对比字符串长度,如果长度不相等 (jne 40139b),则直接返回 1,表示字符串不相等。
  4. 如果字符串长度相等,接着执行逐字符比较的部分: 首先检查 %rbx 指向的字符是否为字符串结束符(\0),如果是,则直接返回 0,表示字符串相等。 如果不是结束符,则比较 %rbx%rbp 指向的字符。如果不相等,立即返回 1,表示字符串不相等。如果相等,则继续比较下一个字符。循环执行字符比较的过程,直到找到不相等的字符或者两个字符串都到达结尾为止。最后,根据比较结果,将 1 或 0 存储在 %eax 中作为返回值,表示字符串是否不相等。最后,恢复被保存的寄存器值,并通过 ret 指令返回函数。

查看0x402400地址的值,就是要和输入比较的值。

炸弹一被拆除! 

相关文章:

  • Redis数据的持久化
  • SpringCloud Alibaba详解
  • NoSQL 与传统数据库的集成
  • WPF中如何在MVVM模式下关闭窗口
  • 大数据Doris(二十六):数据导入(Routine Load)介绍
  • 【大数据分布并行处理】单元测试(五)
  • Spring中有哪几种方法获取HttpSession对象
  • 4 redis的HyperLogLog入门原理
  • java发送媒体类型为multipart/form-data的请求
  • 云课五分钟-0Cg++默认版本和升级-std=c++17
  • 将 Fedora 38 平滑升级至 Fedora 39
  • 工厂设计模式
  • 聊聊logback的MDCFilter
  • CSS英文单词强制截断换行
  • Redisson 分布式锁实战应用解析
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • co模块的前端实现
  • es的写入过程
  • JS 面试题总结
  • log4j2输出到kafka
  • mysql innodb 索引使用指南
  • mysql中InnoDB引擎中页的概念
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • PHP变量
  • python3 使用 asyncio 代替线程
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • ucore操作系统实验笔记 - 重新理解中断
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 基于组件的设计工作流与界面抽象
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 全栈开发——Linux
  • 数据仓库的几种建模方法
  • 小程序button引导用户授权
  • 用mpvue开发微信小程序
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #宝哥教你#查看jquery绑定的事件函数
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • $(function(){})与(function($){....})(jQuery)的区别
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)Linux+Windows下安装ffmpeg
  • (原)本想说脏话,奈何已放下
  • (转)母版页和相对路径
  • ***通过什么方式***网吧
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core 和 .NET Framework 中的 MEF2
  • .net 生成二级域名
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)