PWN基本工具

0x00-GDB工具安装

https://zhuanlan.zhihu.com/p/129837931

gdb这三个插件不能同时运行,可以使用命令

1
vim ~/.gdbinit

gdbinit

不需要使用哪个就注释掉哪个

0x01-GDB基本使用

编译

首先先使用gcc生成elf文件,-g表示可以debug

1
gcc inputfile -o outputfile -g

使用下面命令打开

1
gdb file

命令

https://blog.csdn.net/Breeze_CAT/article/details/103789233

https://www.cnblogs.com/zhwer/p/12494317.html

基本命令

1
2
3
4
5
6
7
8
9
10
help//帮助
i//info
i b//info break查看所有断点信息
i r//info registers 查看各个寄存器当前的值
i f//info function 查看所有函数名,保留符号
show //和info相似,但是是查看调试器的基本信息
show args//查看参数

backtrace//查看调用堆栈
q//quit退出

执行命令

1
2
3
4
5
6
s//step,单步步入,跟进函数中,也就是step into,源码层面的一步,F7
si//同s,汇编层面的一步
n//next,单步补过,F8,源码层面的一步
ni//同n,汇编层面的一步
c//continue,F9,继续执行到断点
r//run,重新开始执行

断点指令-break

1
2
3
4
5
6
7
8
b*(0x123456)//给0x123456地址的指令下断点
b*$rebase(0x123456)//$rebase在调试开PIE的程序的时候可以直接加上程序的随即地址
b func_name//给函数func_name下断点,目标文件要保留符号才行
b file_name:func_name
b file_name:15//给file_name的15行下断点,需要有源码
b 15
b +0x10//在程序当前停住的位置下0x10的位置下断点,也可以-0x10,就是前0x10
break fun if $rdi==5//条件断点,rdi的值为5的时候才断

删除、禁用断点的指令

1
2
3
4
5
//先使用i b查看断点编号
delete 5//删除5号断点,如果直接delete不加数字,表示删除所有断点
disable 5//禁用5号断点
enable 5//启用5号断点
clear//清除下面的所有断点

内存断点指令

1
2
3
watch 0x123456//0x123456地址的数据改变的时候会断
watch a//变量a改变的时候会断
info watchpoints//查看watch断点信息

打印指令

查看内存指令x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
x /nuf 0x123456//x指令的格式是:x /nfu,nfu代表三个参数
n//代表显示几个单元(而不是显示几个字节,后面的u表示一个单元多少个字节),放在'/'后面
u//代表一个单元几个字节,b(一个字节),h(两个字节),w(四字节),g(八字节)
f//代表显示数据的格式,f和u的顺序可以互换,也可以只有一个或者不带n
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
s 按字符串显示。
b 按字符显示。
i 显示汇编指令。
x /10gx 0x123456//从0x123456开始每个单元八个字节,十六进制显示十个单元的数据
x /10xd $rdi//从rdi指向的地址向后打印十个单元,每个单元四字节的十进制数
x /10i 0x123456//从0x123456处向后显示十条汇编指令

打印指令p(print)

1
2
3
4
5
6
p func_name//打印func_name的地址,需要保留符号
p 0x10-0x8//计算0x10-0x8的结果
p &a//查看变量a的地址
p *(0x123456)//查看0x123456的值
p $rdi//显示rdi寄存器的值
p *($rdi)//显示rdi指向的值

打印汇编指令disass(disassemble)

1
2
disass 0x123456//显示0x123456前后的汇编指令
x /10i //前面说过了

打印源代码list

1
2
3
4
list//查看当前附近10行的代码
list 38//查看28行附近10行的代码
list 1,10//查看1-10行代码
list main//查看main函数的开始10行

查找指令

1
2
search rdi//从当前位置向后查找包含rdi的指令
find "hello"//查找hello字符串,pwndbg独有

修改数据指令-set

1
2
3
set $rdi=0x10//把寄存器的值变为0x10
set *(0x123456)=0x10//把0x123456地址的值变为0x10,注意带星号
set args "abc" "def" "gh"//给参数123赋值

其他

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
堆操作指令(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插件独有指令
cyclc 50 //生成50个用来溢出的字符,如:aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaama

$reabse //开启PIE的情况的地址偏移

b *$reabse(0x123456) //断住PIE状态下的二进制文件中0x123456的地方
codebase //打印PIE偏移,与rebase不同,这是打印,rebase是使用
stack //查看栈

retaddr //打印包含返回地址的栈地址
canary //直接看canary的值

plt //查看plt表

got //查看got表
hexdump //像IDA那样显示数据,带字符串