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地址的值,就是要和输入比较的值。

炸弹一被拆除! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/190933.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DRF纯净版项目搭建和配置

一、安装模块和项目 1.安装模块 pip install django pip install djangorestframework pip install django-redis # 按需安装 2.开启项目和api (venv) PS D:\pythonProject\env_api> django-admin startproject drf . (venv) PS D:\pythonProject\env_api> python ma…

maptalks三维地图网址

三维 地址: http://examples.maptalks.com/examples/cn/gltf/gltf-marker/shader

记一次服务器配置文件获取OSS

一、漏洞原因 由于网站登录口未做双因子校验,导致可以通过暴力破解获取管理员账号,成功进入系统;未对上传的格式和内容进行校验,可以任意文件上传获取服务器权限;由于服务器上配置信息,可以进一步获取数据库权限和OSS管理权限。二、漏洞成果 弱口令获取网站的管理员权限通…

vue解除数据双向绑定

let obj JSON.parse(JSON.stringify(data));例如&#xff0c;table列表中&#xff0c;点击编辑时&#xff0c;可对val进行如上操作来解除双向绑定

从0开始学习JavaScript--JavaScript DOM操作与事件处理

在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;是一个至关重要的概念&#xff0c;它为JavaScript提供了一种与HTML和XML文档交互的方法。本文将深入探讨DOM的概念与作用&#xff0c;以及JavaScript与DOM之间的密切关系。 DOM的概念与作用 DOM是什么&#…

python正则匹配示例

需要再如下图的txt中把 1100开头的订单号 提取出来&#xff0c;这个时候需要用到正则表达式 import rewith open(source.txt, r) as file:lines file.readlines()target \1100 target_lines [] for line in lines:if line.find(target) ! -1: print("match string…

基于PLC的自动洗碗机控制系统(论文+源码)

1.系统设计 本课题基于PLC的自动洗碗机控制系统&#xff0c;在此将主要功能设定如下&#xff1a; 通过上下喷头旋转喷水湿润餐具&#xff1b;添加洗涤剂&#xff08;洗碗液&#xff09;&#xff1b;上下喷头喷水洗涤餐具&#xff1b;排出污水&#xff1b;往碗碟上喷洒更多的水…

八股文-TCP的四次挥手

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;它的连接的建立和关闭过程都是经过精心设计的。在TCP连接关闭时&#xff0c;使用四次挥手来保证数据的完整传输和连接的正常终止。 漫画TCP的四次挥手 第一次挥手&#…

机器学习笔记 - 隐马尔可夫模型的简述

隐马尔可夫模型是一个并不复杂的数学模型,到目前为止,它一直被认为是解决大多数自然语言处理问题最为快速、有效的方法。它成功地解决了复杂的语音识别、机器翻译等问题。看完这些复杂的问题是如何通过简单的模型得到描述和解决,我们会由衷地感叹数学模型之妙。 人类信息交流…

Android Studio 写一个Java调用c++ 的demo

前提条件&#xff1a; 本地已经配置好了ndk环境,如果没有配置好&#xff0c;建议参考macos 配置ndk环境-CSDN博客 这篇链接。 新建一个Empty Project 比如我这里的Project的名字是HelloJNI&#xff0c;包名是com.example.hellojni 然后在src目录下&#xff0c;右键选择Add C …

竞赛选题 疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据全国疫情数据分析与3D可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff0…

pyqt designer的版本问题

之前我的电脑Windows11 python3.12上安装好了pyqt6后&#xff0c;安装不了pyqt6-tools&#xff0c;导致不能使用designer设计师服务。经过摸索&#xff0c;然来只需要安装qt-tools就够了。qt-tools在plugin包里。比如文章顶部的资源包&#xff0c;下载下来直接使用pip安装该whl…