pwn相关工具使用


checksec

查看程序的保护

checksec   --file='./vul'

ROPgadget

查看程序中指令片段地址

ropgadget   --binary  ./vul   --only  'pop|ret'  | grep rax
ropgadget   --binary  ./ret2libc   --string  '/bin/sh'   # 查找程序中/bin/sh字符串的地址

one_gadget

通过libc文件中本身含有的代码片段来调用一个shell

one_gadget libc-2.23.so		# 查看libc中含有的代码片段

pwndbg

动态调试

start    		# 使程序执行到main函数(程序入口处)停下来,等于b main;  run;
b main   		# 打断点到main函数
n  next    		# 执行下一条指令(单步执行)---步过
s  step    		# 步入
c  continue  	# 继续执行
finish   		# 结束当前函数
stack 20   		# 查看20条栈的内容
telescope  $ebp     # 查看栈中ebp附近的内容
x/20i  地址    	# 查看该地址及以后的20条汇编指令(i代表intel)
x/20wx      	# 查看20个8字节地址的栈内容
x/20gx       	# 查看20个4字节地址的栈内容
x/s   地址		# 查看该地址处的字符串
distance   地址1   地址2      # 计算出两个地址的距离
set disassembly-flavor intel   # 如果汇编代码为AT&T,则可以使用这条命令来转换为intel格式的汇编
disass  函数名   			# 将指定函数进行反汇编
disass   				# 将当前所在的函数进行反汇编
info functions    		# 查看所有函数符号表
info reg   				# 查看当前所有寄存器的信息
info breakpoints  		# 列出所有断点信息
info args   			# 显示当前函数参数
info locals  			# 打印本地局部变量
info variables  		# 打印全局变量名称
del 1  					# 删除编号为1的断点
del 					# 删除所有断点
clear *0x00400123   	# 清除指定内存地址的断点
disable 2  				# 禁用指定编号断点
enable 2  				# 启动指定编号断点
print /x $rdi  			 # 以十六进制输出rdi寄存器中的值
layout regs  			# 切换布局,同时显示寄存器信息和汇编代码
tui disable   			# 回归原本的布局
attach {process-id}   	# 链接到正在运行的进程,并进行调试
detach   			   # 断开链接
show commands   		# 查看历史命令
<enter>(回车)  		# 执行上一条命令
source {filepath}   	# 从文件中加载gdb命令
q   					# 退出gdb
pwndbg   				# 查看pwndbg命令帮助
list main  				# 查看指定函数附近的汇编代码
list *0x00400800   		# 查看指定地址附近的代码
frame  					# 打印当前运行的栈帧
backtrace   			# 打印backtrace
dt FILE   				# 打印指定类型的信息
dt "struct malloc_state"   # 显示malloc_state结构体信息(有各个字段的偏移)
xinfo [address]  			# 显示指定地址到有用位置的偏移
vis_heap_chunks    	# 可视化显示当前堆的分配情况
malloc_chunk [addr]   # 打印出指定地址的malloc_chunk
set follow-fork-mode parent/child   # 设置当进程调用fork时是否进入子进程
vmmap   	# 显示目标程序的虚拟内存布局信息,包括堆、栈的起始地址和大小,共享库的范围。
b *$rebase(0x18540)    #对开启pie的程序根据偏移地址下断点
attach 进程pid  ;  return  # 调试exp的进程,进去后然后return
libc   #查看libc的基地址
fmtarg  <address>     # 查看某一地址是格式化字符串的第几个参数
heap  # 查看已分配的堆
vis_heap_chunks   # 查看堆空间的chunksz
bins  # 查看bin的状态

img

/x  十六进制
/d  十进制
/o  八进制
/t  二进制
/i  汇编代码
/s  字符串
/b   1字节
/w   4字节
/g   8字节

shell命令

ldd ./test.out   # 查看test.out的libc文件软链接路径
file 软链接地址   # 查看软链接实际指向的文件路径
strings vul |grep flag     # 查找vul程序中的字符串,并过滤出flag字符串

radare2

二进制分析框架,kali自带

radare2与gdb的区别:radare2是静态分析工具,gdb是动态调试工具

rabin2 -l vul    # radare2的一个子程序,打印出vul文件的系统属性、语言、字节序、框架、以及使用了哪些加固技术
r2  ./vul   	# 启动radare2来分析vul程序

工具启动后的操作命令

ie  			# 手动打印出程序入口点
fs   			# 查看所有的flags,一个flag是所有类似特征的集合
fs imports;f  	# 打印出imports集合中的内容,打印其他集合中的内容也类似
iz   			# 输出只读数据段中的字符串
axt @@str.*   	# 在data/code段里寻找某个地址相关的引用   然后再加上afl把相关信息打印出来
ax?  			# 查看相关帮助信息
@@?   			# 查看相关帮助信息
s main  		# 把程序停在main函数
pdf   			# (print disamble) 输出反汇编代码
pdf@sym.beet   	# 对sys.beet函数进行反汇编
ahi s @@=地址  	# 用来设置字符串特定的偏移地址 
ood xxxx   			# 输入xxxx字符串对程序进行调试
dc  				# 输出上一条命令的调试结果

rahash2子程序

rahash2 -E rot -S s:13 -s 'Megabeets'    # 求出这个字符串的校验值

patchelf

patchelf --replace-needed libc.so.6 ./libc-2.23.so ./pwn   # 替换动态库
patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 ./ld-linux-x86-64.so.2 ./pwn  # 设置动态库解析器

文章作者: 0x00dream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0x00dream !
  目录