Pwn学习随笔( 五 )

Pwn学习随笔

文章插图
而当我们单步执行,执行完puts函数后,在此查看该地址所存储的内容,可以看到该地址存储的内容已经发生了改变
Pwn学习随笔

文章插图
具体的流程可以看下面这张图片,对于符号去got表中找它的真实地址,如果不存在就触发链接器/加载器去更新函数的真实地址
Pwn学习随笔

文章插图

Pwn学习随笔

文章插图
在此查看0xf7e3cc30处存储的内容 , 其实就是glibc这个运行库中的puts函数的真实地址
Pwn学习随笔

文章插图
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 //常用 , 汇编层面的一步
  • n//单步步过,遇到函数不跟进,相当于step over,源码层面的一步
    • ni //常用,汇编层面的一步
  • 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不接数字删除所有缩写: d 5
  • 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: