PWN二进制安全修仙秘籍【第一章#工具篇02】GDB的使用及pwndbg插件安装

devtools/2024/9/23 12:41:43/

很多人在学习新知识之前都不喜欢研究理论、原理,我觉得这是大错特错的!!!

所以

在学习GDB的使用之前,我们先来学习一下GDB的组成

1. GDB的组成

下面这张图就是GDB的组成架构,是不是很抽象哩,看不懂哩,让我总结一下!(其实我也看不懂

 简单来说就是

用户(就是我,小坤同学)

通过

cli接口或者mi接口(就是可视化的图形界面)

然后

通过ptrace系统调用实现(ptrace系统调用是什么东东,百度了一下,下面详细讲讲俺百度的内容


2. 工作原理(本质就是ptrace系统调用)

 下面展示一段很抽象很简单的代码,也就是ptrace的函数原型:

#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);/* 
pid_t pid:指示ptrace要跟踪的进程;
*void addr:指示要监控的内存地址;
*data:存放读取出的或者要写入的数据;
enum __ptrace_request request:决定了系统调用的功能,它主要有以下几个选项:1.PTRACE_TRACEME:表示表示被父进程跟踪,任何信号(除了SIGKILL)都会暂停子进程,接着阻塞于wait()等待的父进程被唤醒。子进程内部调用exec()时会发出SIGTRAP信号,可以让父进程在子进程新程序开始运行之前就完全控制它;2.PTRACE_ATTACH:attach到一个指定的进程,使其成为当前进程跟踪的子进程,而子进程的行为等同于进行了一次PTRACE_TRACEME操作。需要注意的是,虽然当前进程成为被跟踪进程的子进程,但是子进程使用getppid()得到的仍是其原始父进程的PID;3.PTRACE_CONT:继续运行之前停止子进程。可同时向子进程交付指定的信号。
*/

研究一个东西,只需要知道它有什么用来自哪里它要去哪里就行了!!!

他有什么用??

ptrace系统调用可以操作父进程观察和控制其他进程的执行(痴汉),检查和改变其核心映像以及寄存器(大男子主义)

它来自哪里??

ptrace系统调用被封装在libc中,使用时需要引入ptrace.h头文件,通过传入一个请求参数和一个进程ID来调用。

它要去哪里??

详细的调用过程等我再单独单开一篇,写完后再贴上来。


3. 三种调用方式

第一种 运行并调试一个新进程

步骤一:输入gdb 目标程序      或者    输入gdb后通过file命令指定目标程序

步骤二:输入run命令就可以愉悦の进行调试了~

这里详细讲讲run命令后执行的一系列底层操作:

首先 操作系统通过fork()系统调用创建一个新进程;

然后 在新创建的子进程中执行操作ptrace(PTRACE_TRACEME,0,0,0);

最后 在子进程中通过execv()系统调用加载用户指定的可执行文件。

第二种 attach并调试一个已经运行的进程

步骤一:用户确定需要进行调试的进程PID;(查看pid命令:ps aux)

步骤二:运行GDB,输入attach pid命令即可。(知识都是环环相扣的,tmux分屏这时候就体现到好处了:一屏运行程序,二屏查找pid,三屏运行gdb)

 这里再补充一下底层做了什么:

对该进程执行操作ptrace(PTRACE_ATTACH,pid,0,0)。

第三种 远程调试目标机上新创建的进程

步骤一:远程调试目标机子上输入如下命令

# 假设你想调试的进程ID是1234,开放远程调试端口9999
gdbserver :9999 --attach 1234

步骤二:在本地使用gdb的机子上输入如下命令

gdb
# 在GDB中
(gdb) target remote target-ip:9999

 照例讲一下原理吧:

首先 GDB运行在调试机上,gdbserver运行在目标机上,两者之间的通信数据格式由GDB远程串行协议(Remote Serial Protocol,RSP)定义;

然后 RSP协议数据的基本格式为:$......#xx

最后 gdbserver的启动方式相当于运行并调试一个新创建的进程。


4. 断点的实现

大家为什么要使用GDB?

最多的需求就是打断点

在这小节我们讲讨论如何实现断点

断点分为两种

硬件断点,顾名思义,通过硬件实现

在x86架构中,提供了8个调试寄存器(DR0~DR7)和2个MSR寄存器,其中DR0~DR3是硬件寄存器,用于放入内存或I/O地址,设置执行、修改等操作。

软件断点,通过内核信号实现

在x86架构中,内核向某个地址打断点,实际上就是往该地址写入断点指令INT 3,即0xCC;

目标程序运行到这条指令之后就会触发SIGTRAP信号

GDB捕获到这个信号,并根据目标程序当前停止的位置查询GDB维护的断点链表

若发现在该地址确实存在断点,则可判定为断点命中。


 5. GDB窗口叫TUI

TUI(TextUser Interface)为GDB调试的文本用户界面

有五种窗口:

command窗口,即命令窗口,可以键入调试命令

source窗口,源代码窗口,显示当前行,断点等信息

assembly窗口,汇编代码窗口

register窗口,寄存器窗口

split窗口,源码和汇编混合窗口

下面介绍一个在gdb里使用的命令layout

输入layout src,即可进入源代码窗口,看下面!!

那要怎么退出咧?
有点复杂,和麻烦,就是要使用快捷键组合CTRL+XCTRL+A可以关闭分屏窗口 

下面为兄弟们总结好layout分屏的相关命令了,接好了!

# 显示源代码窗口
layout src# 显示汇编窗口
layout asm# 显示源代码/汇编和寄存器窗口
layout regs# 显示源代码和汇编窗口
layout split# 显示下一个layout
layout next# 显示上一个layout
layout prev# 刷新窗口
Ctrl + L# 单窗口模式,显示一个窗口
Ctrl + x,再按1# 双窗口模式,显示两个窗口
Ctrl + x,再按2# 退出layout分屏
Ctrl + x,再按a

6. GDB常用操作命令

最后就总结一下GDB调试中常用的操作命令,忘记命令的时候来瞧一眼

特别注意的是!!

所有的地址操作,都要在地址前加上星号  * !!!

  • 断点操作相关命令
# 下断点
break# 查看断点
info break# 禁用断点
disable# 启用断点
enable# 清除断点
clear
  • 步进/步过/继续/启动命令
# 以源码的形式单步步进,会进入子程序
step# 以源码的形式单步步过,不会进入子程序
next# 以机器码的形式单步步进,会进入子程序
stepi# 以机器码的形式单步步过,不会进入子程序
nexti# 在信号或断点之后,继续运行被调试程序
continue# 启动被调试程序
run
  •  打印输出命令
# 求表达式expr的值并打印
print [expr]# 查看内存;指定要查看n个单位的内存值;显示格式是print('x','d','u','o','t','a','c','f','s')使用的格式之一,再加i(机器指令);u是单位大小,常用单位有b表示单字节、h表示双字节、w表示四字节、g表示八字节
x/nfu <addr># 每次程序停止时打印表达式expr或者内存地址addr的值
display <expr>|<addr># 打印整个栈的回溯,每个栈帧一行
backtrace# 反编译指定函数
disassemble# 反编译的同时显示机器码
disassemble /r# 查看栈帧信息
info frame

7. 增强工具pwndbg/peda/gef

一般的小黑子是不会用原生的GDB的

他们会加点科技

就是下面这些常用的插件工具

pwndbg:是一个GDB插件,使GDB的调试不那么糟糕,重点关注低级软件开发人员、硬件黑客、逆向工程师和开发人员需要的特性;(最常用)
peda:GDB的Python开发协助;
gef:是一组用于x86/64、ARM、MIPS、PowerPC和SPARC的命令,用于在使用老式GDB时帮助开发人员和反向工程师。

安装步骤就不重复了,网上很多文章,这里抄一篇大佬的文章Linux下gdb(插件pwndbg、pead、gef)安装及调试常用指令

下一节拿一个案例来具体说说gdb调试怎么用吧~


http://www.ppmy.cn/devtools/115991.html

相关文章

云安全 | AWS S3存储桶安全设计缺陷分析

什么是AWS S3&#xff1f; 默认情况下&#xff0c;Amazon S3 是安全的。创建后&#xff0c;只有资源所有者才能访问他们创建的 Amazon S3 资源。 Amazon S3 支持用户身份验证来控制对数据的访问。您可以使用存储桶策略和访问控制列表 (ACL)等访问控制机制来有选择地向用户和用…

k8s pod网络故障注入,命令行实现

工具介绍 crictl工具&#xff1a;用于查询k8s pod和容器信息nsenter工具&#xff1a;用于进入容器的网络命名空间tc工具&#xff1a;注入网络故障 实现k8s pod级别网络故障 首先查找故障注入的pod的宿主机&#xff0c;并ssh登陆进去 kubectl get pod -n <namespace> …

实验报告1--Spring Boot自定义异常处理

实验报告1-Spring Boot自定义异常处理&#xff08;1&#xff09; 实验报告1-Spring Boot自定义异常处理&#xff08;2&#xff09; 资源下载 一、实现思路 实现根据员工id删除员工对象的功能。 要求&#xff1a;1、处理Exception异常。 2、处理自定义的MyException异常。 …

js工具方法将某节点及其子孙节点全部置为disabled

/*** 将某节点及其子孙节点全部置为disabled*/const setDisable (treeSelectData: any, id: any) > {// console.log(treeSelectData, id);// 遍历数组&#xff0c;即遍历某一层节点for (let i 0; i < treeSelectData.length; i) {const node treeSelectData[i];if (n…

Paragon NTFS for Mac和Tuxera NTFS for Mac,那么两种工具有什么区别呢?

我们在使用Mac系统读取U盘的过程中往往会遇到一个问题&#xff0c;那就是U盘插进电脑无法显示&#xff0c;或者只能读取不能编辑。出现这种情况的原因就一般是格式错误。 很多小伙伴在解决这种问题的时候会选择使用U盘读写工具&#xff0c;那么哪一种读写工具比较好呢&#xf…

Python 单元测试:深入理解与实战应用20240919

Python 单元测试&#xff1a;深入理解与实战应用 引言 在动态语言如 Python 中&#xff0c;代码的灵活性和动态特性使得开发效率大大提升&#xff0c;但也带来了潜在的风险&#xff1a;小的改动可能导致不可预见的功能失效。因此&#xff0c;确保代码逻辑的正确性和稳健性至关…

反病毒技术和反病毒软件(网络安全小知识)

一、反病毒技术的难点 病毒变异与多态性&#xff1a;病毒开发者不断利用新技术和漏洞&#xff0c;创造出新的病毒变种和多态病毒。这些病毒能够自我变异&#xff0c;从而避开传统的基于特征码的检测方法&#xff0c;使得反病毒软件难以识别和清除。 未知病毒检测&#xff1a;在…

基于python的文本聚类分析与可视化实现,使用kmeans聚类,手肘法分析

1、数据预处理 由于在数据分析之前数据集通常都存在数据重复、脏数据等问题&#xff0c;所以为了提高 数据分析结果的质量&#xff0c;在应用之前就必须对数据集进行数据预处理。数据预处理的方法通常有清洗、集成、转换、规约这四个方面&#xff0c;接下来详细介绍这对爬取…