HIT-CSAPP实验二gdb和edb的配置

news2024/9/21 16:46:44

笔者只是根据自己的电脑进行环境的配置,不一定适配所有的电脑,也不是万能的方法,如果读者使用本人的方法没有配置成功本人深表抱歉。

gdb的使用

通过网上查阅一些资料获得

gdb查看内存和寄存器以及中断设置(转)_gdb查看寄存器_wfreehorse的博客-CSDN博客

gdb bomb 
disassemble main
disassemble phase_2
break 序号 #设置断点
run 断点运行

举例:寻找rbp-0x30地址上的值

前置指令
打第二关的时候 提前把第一关的指令写入文件中
gdb bomb
break phase_2 #在第二个地方设置断点
run sol.txt
输入第二组数据


实验环境的建立

PPT上的好像不好使???感谢战友yt提供的代码

安装# install dependencies

sudo apt-get install     cmake    build-essential    libboost-dev
sudo apt-get install   libqt5xmlpatterns5-dev       qtbase5-dev
sudo apt-get install  libqt5svg5-dev        libgraphviz-dev            libcapstone-dev
sudo apt install edb-debugger

安装# build and run edb 

sudo apt install git
git clone --recursive https://github.com/eteran/edb-debugger.git
cd edb-debugger
mkdir build
cd build
cmake ..   如出错 sudo apt-get install --reinstall pkg-config cmake-data
make
./edb           https://www.cnblogs.com/hizf/p/7843463.html   加搜索路径

chmod 777 bomb

777 = 111 111 11 二进制表示三种模式都允许 

chmod u+x bomb

u:user x运行允许 

拆弹过程

cd 到所在的位置

edb --run bomb

阶段1

edb

run运行到readline  随便输入一个字符串让程序运行

 随便输入回车后发现运行到下一句mov那里 参数传递+下一句函数调用

看观察窗rax显示输入的内容 ,参数送给rdi,然后继续step out运行 ,执行到调用phase1,然后step into

在调用函数是否相等之前,他调用了一个赋值指令,并且编译器后边提示是一个内容:“And they...."字符串,也可以直接通过地址查看内容:在 data dump区域输入地址

Tesql是做异或操作 但是我不理解为什么 是为了加载一个标志位么

ZF位等于0,表明结果不相等 返回值不是0,不相等就跳转到bombexplode函数,程序结束

将代码写入文件第一关闯关成功! 

gdb

转载一个博主的论文,testq 可以看成是否是等于0的指令 eax存的是string not equal的返回值 

2.第二关执行相同的操作:先把第一关的正确答案输入,建议用

edb --run bomb1 sol.txt

然后到phase_2的时候也是step into

#分配总共的空间
#rbp的值-0x30给rsi
cmp dword [rbp-0x30],0 #比较四字节大小在位置rbp-0x30的数据和0比较
js判断是否是负数
推测输入的六位数据是存放在rdi 第一个参数寄存器中

第二个我是直接看反汇编代码分析--->asm1.txt中

AT&T格式
0000000000401414 <phase_2>:
  401414:	55                   	push   %rbp
  401415:	48 89 e5             	mov    %rsp,%rbp
  401418:	53                   	push   %rbx
  401419:	48 83 ec 28          	sub    $0x28,%rsp        #前几步都是程序的准备工作
  40141d:	48 8d 75 d0          	lea    -0x30(%rbp),%rsi  #rsi = rbp-00x30
  401421:	e8 1a 05 00 00       	call   401940 <read_six_numbers>
  401426:	83 7d d0 00          	cmpl   $0x0,-0x30(%rbp)
  40142a:	78 07                	js     401433 <phase_2+0x1f>
  40142c:	bb 01 00 00 00       	mov    $0x1,%ebx
  401431:	eb 0f                	jmp    401442 <phase_2+0x2e>
  401433:	e8 e6 04 00 00       	call   40191e <explode_bomb>
  401438:	eb f2                	jmp    40142c <phase_2+0x18>
  40143a:	e8 df 04 00 00       	call   40191e <explode_bomb>
  40143f:	83 c3 01             	add    $0x1,%ebx
  401442:	83 fb 05             	cmp    $0x5,%ebx
  401445:	7f 17                	jg     40145e <phase_2+0x4a>
  401447:	48 63 c3             	movslq %ebx,%rax
  40144a:	8d 53 ff             	lea    -0x1(%rbx),%edx
  40144d:	48 63 d2             	movslq %edx,%rdx
  401450:	89 d9                	mov    %ebx,%ecx
  401452:	03 4c 95 d0          	add    -0x30(%rbp,%rdx,4),%ecx
  401456:	39 4c 85 d0          	cmp    %ecx,-0x30(%rbp,%rax,4)
  40145a:	74 e3                	je     40143f <phase_2+0x2b>
  40145c:	eb dc                	jmp    40143a <phase_2+0x26>
  40145e:	48 83 c4 28          	add    $0x28,%rsp
  401462:	5b                   	pop    %rbx
  401463:	5d                   	pop    %rbp
  401464:	c3                   	ret    

 看到read six numbers猜测该程序有6个参数,指令cmpl   $0x0,-0x30(%rbp) 参数rbp-0x30和0比较如果小于0跳转,推测第一个传入的参数>=0;指令mov    $0x1,%ebx 401431 jmp    401442 <phase_2+0x2e      call   40191e <explode_bomb>   jmp    40142c <phase_2+0x18>  call 40191e <explode_bomb>  add    $0x1,%ebx   cmp    $0x5,%ebx推测结构类似 for(i = 0; i< 5;i++)结构,ebx是计数器i;edx是ebx-1的前一个编号,利用地址可以得到(%rsp,%rax,4)为第i个参数用类似数组来表示,指令add    (%rsp,%rdx,4),%ecx表明后续参数的递推关系式为前一个参数加上当前的计数I(0到5),即对正整数N,二阶段炸弹拆弹字符串

3.

0000000000401465 <phase_3>:
  401465:	55                   	push   %rbp
  401466:	48 89 e5             	mov    %rsp,%rbp
  401469:	48 83 ec 10          	sub    $0x10,%rsp
  40146d:	48 8d 4d f8          	lea    -0x8(%rbp),%rcx
  401471:	48 8d 55 fc          	lea    -0x4(%rbp),%rdx
  401475:	be 0f 33 40 00       	mov    $0x40330f,%esi
  40147a:	b8 00 00 00 00       	mov    $0x0,%eax
  40147f:	e8 8c fc ff ff       	call   401110 <__isoc99_sscanf@plt>
  401484:	83 f8 01             	cmp    $0x1,%eax
  401487:	7e 11                	jle    40149a <phase_3+0x35>
  401489:	8b 45 fc             	mov    -0x4(%rbp),%eax
  40148c:	83 f8 07             	cmp    $0x7,%eax
  40148f:	77 46                	ja     4014d7 <phase_3+0x72>
  401491:	89 c0                	mov    %eax,%eax
  401493:	ff 24 c5 b0 31 40 00 	jmp    *0x4031b0(,%rax,8)
  40149a:	e8 7f 04 00 00       	call   40191e <explode_bomb>
  40149f:	eb e8                	jmp    401489 <phase_3+0x24>
  4014a1:	b8 4c 02 00 00       	mov    $0x24c,%eax
  4014a6:	39 45 f8             	cmp    %eax,-0x8(%rbp)
  4014a9:	75 3f                	jne    4014ea <phase_3+0x85>
  4014ab:	c9                   	leave  
  4014ac:	c3                   	ret    
  4014ad:	b8 34 02 00 00       	mov    $0x234,%eax
  4014b2:	eb f2                	jmp    4014a6 <phase_3+0x41>
  4014b4:	b8 af 01 00 00       	mov    $0x1af,%eax
  4014b9:	eb eb                	jmp    4014a6 <phase_3+0x41>
  4014bb:	b8 12 03 00 00       	mov    $0x312,%eax
  4014c0:	eb e4                	jmp    4014a6 <phase_3+0x41>
  4014c2:	b8 99 01 00 00       	mov    $0x199,%eax
  4014c7:	eb dd                	jmp    4014a6 <phase_3+0x41>
  4014c9:	b8 29 02 00 00       	mov    $0x229,%eax
  4014ce:	eb d6                	jmp    4014a6 <phase_3+0x41>
  4014d0:	b8 11 03 00 00       	mov    $0x311,%eax
  4014d5:	eb cf                	jmp    4014a6 <phase_3+0x41>
  4014d7:	e8 42 04 00 00       	call   40191e <explode_bomb>
  4014dc:	b8 00 00 00 00       	mov    $0x0,%eax
  4014e1:	eb c3                	jmp    4014a6 <phase_3+0x41>
  4014e3:	b8 dc 02 00 00       	mov    $0x2dc,%eax
  4014e8:	eb bc                	jmp    4014a6 <phase_3+0x41>
  4014ea:	e8 2f 04 00 00       	call   40191e <explode_bomb>
  4014ef:	eb ba                	jmp    4014ab <phase_3+0x46>

常见的跳转指令

jne 不相等跳转 not equal
js 表示负数跳转 SF
jns非负数跳转

jg great
jge >=

jl 
jle

ja
jae

jb
jbe

 test 是按位取异或,相当于取非的操作,test + js如果是非负则跳转

一波操作下来他们的值 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于安装PicGo后启动无界面问题

关于安装PicGo后启动无界面问题 其实我遇到的这个也不算是问题&#xff0c;也挺无语的。 最近为了搭建图床&#xff0c;需要使用PicGo&#xff0c;第一次搭建图床也是第一次使用PicGo。在安装了PicGo后发现启动不了&#xff0c;查看后台发现PicGo在运行着&#xff0c;但是没有界…

数据结构与算法九 树进阶

一 平衡树 之前我们学习过二叉查找树&#xff0c;发现它的查询效率比单纯的链表和数组的查询效率要高很多&#xff0c;大部分情况下&#xff0c;确实是这样的&#xff0c;但不幸的是&#xff0c;在最坏情况下&#xff0c;二叉查找树的性能还是很糟糕。 例如我们依次往二叉查找…

User Experience Design and Information Architecture

&#x1f4a5;(1) What is IA (Information Architecture)? Definition of four sentences I. Information Architecture is "The structure design of shared informaiton environments-共享信息环境的结构设计" II. Information Architecture is "The sy…

ChatGPT提示词工程(三):Summarizing概括总结

目录 一、说明二、安装环境三、概括总结&#xff08;Summarizing&#xff09;1. 简单地概括总结&#xff0c;只有字数限制2. 概括总结需要关注的某些点 四、用“提取”代替“总结”&#xff08;Try "extract" instead of "summarize"&#xff09;五、概括总…

Mysql第二章 多表查询的操作

这里写自定义目录标题 一 外连接与内连接的概念sql99语法实现 默认是内连接sql99语法实现左外连接&#xff0c;把没有部门的员工也查出来sql99语法实现右外连接&#xff0c;把没有人的部门查出来sql99语法实现满外连接&#xff0c;mysql不支持这样写mysql中如果要实现满外连接的…

生成对抗网络原理

GAN的原理 GAN是在2014年由Ian Goodfellow等人提出的&#xff0c;发表在论文“Generative Adversarial Networks”中。 GAN的主要灵感来源于博弈论中零和博弈的思想&#xff0c;应用到深度学习神经网络上来说&#xff0c;就是通过生成网络G&#xff08;Generator&#xff09;和…

系统架构设计

高性能 客户端内部缓存客户端到服务器之间缓存&#xff1a;CDN,网络专线数据库前加缓存Sessioin等信息共享NoSQL数据库分片&#xff0c;读写分离web层无关态集群负载均衡GeoDNS 就近原则&#xff0c;边缘计算存储异步&#xff0c;解耦&#xff0c;削峰&#xff1a;消息队列离线…

MySQL学习笔记第五天

第06章多表查询 多表查询概述&#xff1a; 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0…

第二十章 渲染管线

渲染管线是计算机图形中最基础最核心的部分&#xff0c;它是将3D场景显示到2D平面的技术过程。在DirectX课程中&#xff0c;我们就介绍了渲染管线&#xff0c;分为固定渲染管线和可编程渲染管线&#xff08;Shader&#xff09;。但是在DirectX 10版本之后统一了渲染架构&#x…

【Java】面试常问知识点(Java基础)

JVM java 栈&#xff1a;线程私有&#xff0c;生命周期和线程&#xff0c;每个方法在执行的同时都会创建一个 栈帧用于存储局部变量表&#xff0c;操作数栈&#xff0c;动态链接&#xff0c;方法出口等信息。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程&#xff1b;栈…

Photoshop如何使用蒙版之实例演示?

文章目录 0.引言1.给单调的天空添加蓝天白云2.清除头发边缘的杂色3.制作景深效果4.制作枯荣共存的树5.制作双重曝光肖像 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对PS进行了学习&#xff0c;本文通过《Photoshop2021入门教程》及其配套素材结合网上相关资料进行…

【Linux内核解析-linux-5.14.10-内核源码注释】内核启动kernel_init解释

源码 解释1 static int __ref kernel_init(void *unused): 声明一个静态整型函数kernel_init()&#xff0c;该函数不会被其他文件访问&#xff0c;使用__ref标记表示该函数是可重定位的&#xff0c;并且该函数不需要任何参数。 wait_for_completion(&kthreadd_done);: 等待…

FL Studio 2023中文高级版水果编曲软件下载

FL Studio 2023中文版是一款非常经典的音乐制作软件&#xff0c;这款软件除了可以为用户提供全面的音乐制作功能之外&#xff0c;还有丰富的主题和皮肤供用户选择&#xff0c;让用户不但做出的音乐具有自己的风格&#xff0c;连制作的音乐的过程也个性十足&#xff0c;非常适合…

荔枝派Zero(全志V3S)驱动开发之串口

系列文章目录 文章目录 系列文章目录前言一、修改及编译设备树1、修改设备树文件2、编译 kernel 二、移植 minicom1、配置buildroot2、编译 buildroot 三、拷贝到 SD 卡四、测试验证1、确认 minicom 是否正常2、确认串口3、发送测试4、接收测试 前言 修改设备树打开 uart1 和 …

14-4-进程间通信-共享内存

之前学习了无名管道&#xff0c;命名管道&#xff0c;消息队列。 还剩下&#xff1a;共享内存&#xff0c;信号&#xff0c;信号量。 本章讨论的是共享内存。 一、共享内存的应用场景 A进程有自己的存储空间&#xff1b; B进程也有自己的存储空间&#xff1b; A进程和B进…

使用物联网技术进行肥胖管理是可行的吗?

在物联网和可穿戴设备的帮助下&#xff0c;个人现在可以监测自己的健康指标&#xff0c;如心率、血糖水平和身体活动。这些个性化的见解帮助人们对自己的生活方式做出明智的决定&#xff0c;从而带来更好的体重管理结果。 利用物联网技术成功管理肥胖症 肥胖是一个全球性的健…

还在挣扎文件

由于在老式打印机里面每打下一行都要进行回车和换行&#xff0c;在windows系统里面也延续了这个惯例&#xff0c;但是c语言是只有换行&#xff0c;但是为了兼容&#xff0c;会自动进行转换&#xff1b;比如&#xff0c;它在写入文件的时候换行会自动转换为回车加换行&#xff0…

加强网络风险生命周期

当今业务环境中云原生应用程序的激增帮助组织简化了运营。 企业现在可以近乎实时地监控数据、与客户互动并分享见解&#xff0c;帮助他们克服曾经阻碍生产力的低效率问题。 然而&#xff0c;使用云也极大地扩展了企业可利用的攻击面。 CSPM、CWPP、CNAPP、SAST、SCA、IaC、D…

网络基础3【网络层、数据链路层】

目录 一.网络层 1.IP协议 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;协议头格式 2.网段划分 3.特殊的IP地址 4.IP地址的数量限制 5.私有IP地址和公网IP地址 6.路由 二.数据链路层 1.以太网 2.以太网帧格式 3.MAC地址 4.对比MAC地址和IP地址 …

【图】邻接矩阵

图的存储结构分为邻接矩阵和邻接表两种&#xff0c;带权的图叫做网。 邻接矩阵 邻接矩阵适合边多的图 无向图 两个顶点之间的连线是双向的&#xff0c;一个一维数组存顶点&#xff0c;一个二维数组存边 若有边则值为1&#xff0c;反之为0 邻接矩阵需要知道点数、边数、一个二维…