快速上手 pwndbg 的基础命令操作
最编程
2024-01-12 22:52:13
...
pwndbg基本操作
基本指令
-
help
//帮助 -
i
//info,查看一些信息,只输入info可以看可以接什么参数,下面几个比较常用-
i b
//常用,info break 查看所有断点信息(编号、断点位置) -
i r
//常用,info registers 查看各个寄存器当前的值 -
i f
//info function 查看所有函数名,需保留符号
-
-
show
//和info类似,但是查看调试器的基本信息,如:-
show args
//查看参数
-
-
rdi
//常用,+寄存器名代表一个寄存器内的值,用在地址上直接相当与一个十六进制变量 -
backtrace
//查看调用栈 -
q
//quit 退出,常用 -
vmmap
//内存分配情况
执行指令
-
s
//单步步入,遇到调用跟进函数中,相当于step into,源码层面的一步-
si
//常用,同s,汇编层面的一步
-
-
n
//单步补过,遇到函数不跟进,相当于step over,源码层面的一步-
ni
//常用,同n,汇编层面的一步
-
-
c
//continue,常用,继续执行到断点,没断点就一直执行下去 -
r
//run,常用,重新开始执行 -
start
// 类似于run
,停在main函数的开始
断点指令
下普通断点指令b(break):
-
b *(0x123456)
//常用,给0x123456地址处的指令下断点-
b *$ rebase(0x123456)
//$rebase 在调试开PIE的程序的时候可以直接加上程序的随机地址
-
-
b fun_name
//常用,给函数fun_name下断点,目标文件要保留符号才行b file_name:fun_name
-
b file_name:15
//给file_name的15行下断点,要有源码才行b 15
-
b +0x10
//在程序当前停住的位置下0x10的位置下断点,同样可以-0x10,就是前0x10 -
break fun if $rdi==5
//条件断点,rdi值为5的时候才断
删除、禁用断点:
-
info break
(简写:i b
) //查看断点编号 -
delete 5
//常用,删除5号断点,直接delete不接数字删除所有 -
disable 5
//常用,禁用5号断点 -
enable 5
//启用5号断点 -
clear
//清除下面的所有断点
内存断点指令watch:
-
watch 0x123456
//0x123456地址的数据改变的时候会断 -
watch a
//变量a改变的时候会断 -
info watchpoints
//查看watch断点信息
捕获断点catch:
-
catch syscall
//syscall系统调用的时候断住 -
tcatch syscall
//syscall系统调用的时候断住,只断一次 -
info break
//catch的断点可以通过i b查看
除syscall外还可以使用的有:
1)throw: 抛出异常
2)catch: 捕获异常
3)exec: exec被调用
4)fork: fork被调用
5)vfork: vfork被调用
6)load: 加载动态库
7)load libname: 加载名为libname的动态库
8)unload: 卸载动态库
9)unload libname: 卸载名为libname的动态库
10)syscall [args]: 调用系统调用,args可以指定系统调用号,或者系统名称
打印指令
查看内存指令x:
-
x /nuf 0x123456
//常用,x指令的格式是:x空格/nfu,nfu代表三个参数-
n
代表显示几个单元(而不是显示几个字节,后面的u表示一个单元多少个字节),放在/
后面 -
u
代表一个单元几个字节,b(一个字节),h(2字节),w(四字节),g(八字节) -
f
代表显示数据的格式,f和u的顺序可以互换,也可以只有一个或者不带n,用的时候很灵活
-
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
s 按字符串显示。
b 按字符显示。
i 显示汇编指令。
-
x /10gx 0x123456
//常用,从0x123456开始每个单元八个字节,十六进制显示10个单元的数据 -
x /10xd $rdi
//从rdi指向的地址向后打印10个单元,每个单元4字节的十进制数 -
x /10i 0x123456
//常用,从0x123456处向后显示十条汇编指令
打印指令p(print):
-
p fun_name
//打印fun_name的地址,需要保留符号 -
p 0x10-0x08
//计算0x10-0x08的结果 -
p &a
//查看变量a的地址 -
p *(0x123456)
//查看0x123456地址的值,注意和x指令的区别,x指令查看地址的值不用星号 -
p $rdi
//显示rdi寄存器的值,注意和x的区别,这只是显示rdi的值,而不是rdi指向的值p *($rdi)
//显示rdi指向的值
打印汇编指令disass(disassemble):
-
disass 0x123456
//显示0x123456前后的汇编指令 -
x /10i
//我一般喜欢用x显示指令
打印源代码指令list:
-
list
//查看当前附近10行代码,要有源码,list指令pwn题中几乎不用,但为了完整性还是简单举几个例子-
list 38
//查看38行附近10行代码 -
list 1,10
//查看1-10行 -
list main
//查看main函数开始10行
-
修改和查找指令
修改数据指令set:
-
set $rdi=0x10
//把rdi寄存器的值变为0x10 -
set *(0x123456)=0x10
//0x123456地址的值变为0x10,注意带星号 -
set args "abc" "def" "gh"
//给参数123赋值 -
set args "python -c 'print "1234\x7f\xde"'"'
//使用python给参数赋值不可见字符
查找数据:
-
search rdi
//从当前位置向后查包含rdi的指令,返回若干 -
search -h
//查看search帮助,我也不太长用这个指令 -
find "hello"
//查找hello字符串,pwndbg独有 -
ropgadget
//查找ropgadget,pwndbg独有,没啥用,可以用其他工具
堆操作指令(pwndbg插件独有)
-
arena
//显示arena的详细信息-
arenas
//显示所有arena的基本信息 -
arenainfo
//好看的显示所有arena的信息
-
-
bins
//常用,查看所有种类的堆块的链表情况
-
fastbins
//单独查看fastbins的链表情况 -
largebins
//同上,单独查看largebins的链表情况 -
smallbins
//同上,单独查看smallbins的链表情况 -
unsortedbin
//同上,单独查看unsortedbin链表情况 -
tcachebins
//同上,单独查看tcachebins的链表情况 -
tcache
//查看tcache详细信息
-
-
heap
//数据结构的形式显示所有堆块,会显示一大堆
-
heapbase
//查看堆起始地址 -
heapinfo
、heapinfoall
//显示堆得信息,和bins的挺像的,没bins好用 -
parseheap
//显示堆结构,很好用
-
-
tracemalloc
//好用,会跟提示所有操作堆的地方
其他pwndbg插件独有指令
-
cyclic 50
//生成50个用来溢出的字符,如:aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaama -
$reabse
//开启PIE的情况的地址偏移-
b *$reabse(0x123456)
//断住PIE状态下的二进制文件中0x123456的地方 -
codebase
//打印PIE偏移,与rebase不同,这是打印,rebase是使用
-
-
stack
//查看栈 -
retaddr
//打印包含返回地址的栈地址 -
canary
//直接看canary的值 -
plt
//查看plt表 -
got
//查看got表 -
hexdump
//像IDA那样显示数据,带字符串
推荐阅读
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。
-
windows下进程间通信的(13种方法)-摘 要 本文讨论了进程间通信与应用程序间通信的含义及相应的实现技术,并对这些技术的原理、特性等进行了深入的分析和比较。 ---- 关键词 信号 管道 消息队列 共享存储段 信号灯 远程过程调用 Socket套接字 MQSeries 1 引言 ---- 进程间通信的主要目的是实现同一计算机系统内部的相互协作的进程之间的数据共享与信息交换,由于这些进程处于同一软件和硬件环境下,利用操作系统提供的的编程接口,用户可以方便地在程序中实现这种通信;应用程序间通信的主要目的是实现不同计算机系统中的相互协作的应用程序之间的数据共享与信息交换,由于应用程序分别运行在不同计算机系统中,它们之间要通过网络之间的协议才能实现数据共享与信息交换。进程间通信和应用程序间通信及相应的实现技术有许多相同之处,也各有自己的特色。即使是同一类型的通信也有多种的实现方法,以适应不同情况的需要。 ---- 为了充分认识和掌握这两种通信及相应的实现技术,本文将就以下几个方面对这两种通信进行深入的讨论:问题的由来、解决问题的策略和方法、每种方法的工作原理和实现、每种实现方法的特点和适用的范围等。 2 进程间的通信及其实现技术 ---- 用户提交给计算机的任务最终都是通过一个个的进程来完成的。在一组并发进程中的任何两个进程之间,如果都不存在公共变量,则称该组进程为不相交的。在不相交的进程组中,每个进程都独立于其它进程,它的运行环境与顺序程序一样,而且它的运行环境也不为别的进程所改变。运行的结果是确定的,不会发生与时间相关的错误。 ---- 但是,在实际中,并发进程的各个进程之间并不是完全互相独立的,它们之间往往存在着相互制约的关系。进程之间的相互制约关系表现为两种方式: ---- (1) 间接相互制约:共享CPU ---- (2) 直接相互制约:竞争和协作 ---- 竞争——进程对共享资源的竞争。为保证进程互斥地访问共享资源,各进程必须互斥地进入各自的临界段。 ---- 协作——进程之间交换数据。为完成一个共同任务而同时运行的一组进程称为同组进程,它们之间必须交换数据,以达到协作完成任务的目的,交换数据可以通知对方可以做某事或者委托对方做某事。 ---- 共享CPU问题由操作系统的进程调度来实现,进程间的竞争和协作由进程间的通信来完成。进程间的通信一般由操作系统提供编程接口,由程序员在程序中实现。UNIX在这个方面可以说最具特色,它提供了一整套进程间的数据共享与信息交换的处理方法——进程通信机制(IPC)。因此,我们就以UNIX为例来分析进程间通信的各种实现技术。 ---- 在UNIX中,文件(File)、信号(Signal)、无名管道(Unnamed Pipes)、有名管道(FIFOs)是传统IPC功能;新的IPC功能包括消息队列(Message queues)、共享存储段(Shared memory segment)和信号灯(Semapores)。 ---- (1) 信号 ---- 信号机制是UNIX为进程中断处理而设置的。它只是一组预定义的值,因此不能用于信息交换,仅用于进程中断控制。例如在发生浮点错、非法内存访问、执行无效指令、某些按键(如ctrl-c、del等)等都会产生一个信号,操作系统就会调用有关的系统调用或用户定义的处理过程来处理。 ---- 信号处理的系统调用是signal,调用形式是: ---- signal(signalno,action) ---- 其中,signalno是规定信号编号的值,action指明当特定的信号发生时所执行的动作。 ---- (2) 无名管道和有名管道 ---- 无名管道实际上是内存中的一个临时存储区,它由系统安全控制,并且独立于创建它的进程的内存区。管道对数据采用先进先出方式管理,并严格按顺序操作,例如不能对管道进行搜索,管道中的信息只能读一次。 ---- 无名管道只能用于两个相互协作的进程之间的通信,并且访问无名管道的进程必须有共同的祖先。 ---- 系统提供了许多标准管道库函数,如: pipe——打开一个可以读写的管道; close——关闭相应的管道; read——从管道中读取字符; write——向管道中写入字符; ---- 有名管道的操作和无名管道类似,不同的地方在于使用有名管道的进程不需要具有共同的祖先,其它进程,只要知道该管道的名字,就可以访问它。管道非常适合进程之间快速交换信息。 ---- (3) 消息队列(MQ) ---- 消息队列是内存中独立于生成它的进程的一段存储区,一旦创建消息队列,任何进程,只要具有正确的的访问权限,都可以访问消息队列,消息队列非常适合于在进程间交换短信息。 ---- 消息队列的每条消息由类型编号来分类,这样接收进程可以选择读取特定的消息类型——这一点与管道不同。消息队列在创建后将一直存在,直到使用msgctl系统调用或iqcrm -q命令删除它为止。 ---- 系统提供了许多有关创建、使用和管理消息队列的系统调用,如: ---- int msgget(key,flag)——创建一个具有flag权限的MQ及其相应的结构,并返回一个唯一的正整数msqid(MQ的标识符); ---- int msgsnd(msqid,msgp,msgsz,msgtyp,flag)——向队列中发送信息; ---- int msgrcv(msqid,cmd,buf)——从队列中接收信息; ---- int msgctl(msqid,cmd,buf)——对MQ的控制操作; ---- (4) 共享存储段(SM) ---- 共享存储段是主存的一部分,它由一个或多个独立的进程共享。各进程的数据段与共享存储段相关联,对每个进程来说,共享存储段有不同的虚拟地址。系统提供的有关SM的系统调用有: ---- int shmget(key,size,flag)——创建大小为size的SM段,其相应的数据结构名为key,并返回共享内存区的标识符shmid; ---- char shmat(shmid,address,flag)——将当前进程数据段的地址赋给shmget所返回的名为shmid的SM段; ---- int shmdr(address)——从进程地址空间删除SM段; ---- int shmctl (shmid,cmd,buf)——对SM的控制操作; ---- SM的大小只受主存限制,SM段的访问及进程间的信息交换可以通过同步读写来完成。同步通常由信号灯来实现。SM非常适合进程之间大量数据的共享。 ---- (5) 信号灯 ---- 在UNIX中,信号灯是一组进程共享的数据结构,当几个进程竞争同一资源时(文件、共享内存或消息队列等),它们的操作便由信号灯来同步,以防止互相干扰。 ---- 信号灯保证了某一时刻只有一个进程访问某一临界资源,所有请求该资源的其它进程都将被挂起,一旦该资源得到释放,系统才允许其它进程访问该资源。信号灯通常配对使用,以便实现资源的加锁和解锁。 ---- 进程间通信的实现技术的特点是:操作系统提供实现机制和编程接口,由用户在程序中实现,保证进程间可以进行快速的信息交换和大量数据的共享。但是,上述方式主要适合在同一台计算机系统内部的进程之间的通信。 3 应用程序间的通信及其实现技术 ---- 同进程之间的相互制约一样,不同的应用程序之间也存在竞争和协作的关系。UNIX操作系统也提供一些可用于应用程序之间实现数据共享与信息交换的编程接口,程序员可以通过自己编程来实现。如远程过程调用和基于TCP/IP协议的套接字(Socket)编程。但是,相对普通程序员来说,它们涉及的技术比较深,编程也比较复杂,实现起来困难较大。 ---- 于是,一种新的技术应运而生——通过将有关通信的细节完全掩盖在某个独立软件内部,即底层的通讯工作和相应的维护管理工作由该软件内部来实现,用户只需要将通信任务提交给该软件去完成,而不必理会它的具体工作过程——这就是所谓的中间件技术。 ---- 我们在这里分别讨论这三种常用的应用程序间通信的实现技术——远程过程调用、会话编程技术和MQSeries消息队列技术。其中远程过程调用和会话编程属于比较低级的方式,程序员参与的程度较深,而MQSeries消息队列则属于比较高级的方式,即中间件方式,程序员参与的程度较浅。 ---- 4.1 远程过程调用(RPC)
-
GVim文字编辑器:基础设定、常用操作指令与代码片段快速上手指南
-
标题:一文搞定Redis面试,附Redis面试大纲+常见Redis面试题-一、基础篇 快速上手 ①. 什么是redis ②. 为什么使用redis ③. 安装 ④. 基本使用(常见数据结构的命令) Java操作redis ①. Jedis ②. SpringBoot 启动redis的方式 ①. 配置文件 ②. 生产环境启动方案 二、进阶篇 redis实现session共享 redis缓存的使用 ①. 注解式 ②. Spring Cache 数据库和缓存双写一致性问题——穿透 redis实现附近的人 redis实现计数器 redis事务 redis分布式锁的使用 redis集群 redis实现延时队列 redis实现限流 redis实现布隆过滤器 发布订阅 redis优化 三、原理篇 redis单线程为什么性能好 数据类型的底层实现 持久化机制 过期策略 内存淘汰 redis优化 哨兵模
-
快速了解tar包压缩与解压的过程:无参数与带参数操作差异说明" 原操作步骤分为两步: 1. 未使用参数的tar命令创建tar包: - tar 命令本身 - gzip 命令 - bzip2 命令 - tar 直接打包 (xx) - tar + .gz 扩展名 (xx.tar.gz) - tar + .bz2 扩展名 (xx.tar.bz2) 2. 使用参数的tar命令实现打包与压缩一步到位: - tar 加 -z 参数 - tar 加 -j 参数 - tar 直接打包并压缩为.gz (xx.tar.gz) - tar 直接打包并压缩为.bz2 (xx.tar.bz2) 通过对比可见,采用带参数的tar命令操作更为便捷,只需在执行tar命令时选择相应的压缩选项即可。常规用法推荐如下:
-
快速指南:Linux中tar.gz和zip压缩包的压缩与解压操作命令集锦
-
快速了解Linux ln命令:创建文件或目录的链接操作指南
-
快速上手H3C模拟器的简易操作指南
-
简单易懂!快速了解华为交换机的基础操作指南
-
在Vim编辑器中快速操作Shell命令的总结