PWN

PWN study 0x04|publicQi gdb_tutorial

Posted by Elli0t on 2020-06-17

gdb

  • file
  • run < xxx 重定向,作为输入
  • break 下断点,如果有PIE可以去ida修改基地址然后寻找断点,下
  • delete 删除断点
  • step/next 单步走,但是会进入函数
  • stepi/nexti 单步走,不会进入
  • finish 走完当前函数
  • print
    • p 0x7fffffffe340 输出$5 = 140737488347968(直接转换成10进制)
    • p *0x7fffffffe340 输出$6 = 3355185(解引用)
  • x = examine 解析
  • gdb x
  • x 0x7fffffffe340 - 0x7fffffff0000 x是可以进行计算的,这样的话可以计算偏移,不用打开计算器
  • x/xg x是16进制,g是打印出8字节的格式(默认是4个字节)x/og 中的 o 是 octonary 八进制打印,同理 d 是十进制
  • x/s s作为字符串打印
  • x/xw 同理 w 是打印出4字节格式
  • x/10xw 效果和上面一样,但是会往后多输出10个项目
  • x/i 解释成指令
  • x *addr 解引用
  • x $reg 查看寄存器内容
  • p stdout
  • p _IO_2_1_stdout_
  • p (FILE) stdout
  • info
  • info proc mappings 和 vmmap 和 pmap 差不多
  • info all-registers 详细🔎显示寄存器
  • set
  • set *addr = val 设置某个地址的值(不管那个段可不可写)
  • set args xxx 作为程序运行时候的参数
  • set follow-fork-mode
    • set follow-fork-mode child 设置子进程
    • set follow-fork-mode parent 设置主进程
  • set environment LD_PRELOAD=./env.so 当一个程序有很多没用的前戏等待会浪费时间的时候,可以写一个C程序并将它编译,然后设置这个就会自动跳过前戏
    • gcc -shared -fPIC -o copy.so time.c 先用strace binary 查看前戏使用的函数是啥,然后man function 在新建的C程序里面写入这个函数的格式,然后用上面这个命令编译。
  • def hook-stop 当使用没有插件的gdb时可以使用这个新建立一个函数并写入函数内容,使每次gdb停下来时执行你写入的命令,命令以end结束
  • def hook-xxx gdb中的所有指令都可以去hook,即xxx可以用run可以用next
  • target remote :1337 调试qemu时方便,1337是网络端口
  • shell 不退出gdb时进入shell
  • attach + pid 链接程序

pwndbg

  • pwndbg 显示pwndbg功能
  • heap 显示malloc出得 chunk
  • bins 查看free的chunk
  • arena put一些arena的数据
  • context
  • retaddr 查看返回地址
  • checksec
  • cyclic 计算偏移工具🔧
  • hexdump 0xff9b528c 直观的查看数据
  • search –writable –qword 0x1
    • search –executable –qword 0x1 在可执行段中查找0x1
    • search –string /bin/sh 查找/bin/sh字符串
  • dump memory copy 0x400000 0x401000 将运行的程序中的内存段导出成copy,起始0x400000结束0x401000
  • bd/be
    • bd 禁用某一个断点
    • be 启用一个断点
  • aslr on 开启aslr
  • pie 如果开了pie可以查看基地址

scripts

  • gdb.attach() 进行调试

  • context.terminal = [‘tmux’, ‘splitw’, ‘-h’] 使用tmux终端调试

  • pwntool+gdb

  • pause() 程序暂停⏸️

  • level=info pwntools回显等级最低一级,除了报错基本不显示其他非exp回显

  • cyclic() + cyclic_find()

  • struct python自带将字节串解读为打包的二进制数据

  • ljust/rjust

    • >>> a
      '\x13\x13\x14\x00\x00\x00'
      >>> recv_context = a
      >>> recv_context.ljust(8, "\x00")
      '\x13\x13\x14\x00\x00\x00\x00\x00'
  • aslr sh = process('./echo1', level="debug", aslr=True) pwntools是默认关着的

others

  • readelf -a libc.so | grep func_name 手动查看👀func偏移
  • strings bin_name 打印程序中的字符串
  • sed -i ‘s/alarm/isinf/g’ bin_namen 本地调试时,修改二进制文件内的函数,将alarm改为isinf
  • diff 查看两个文件是否一样
  • \xcc
  • villoc 可视化堆工具
  • how2heap github上学堆工具
  • aslroff alias aslroff = 'echo 0 > /proc/sys/kernel/randomize_va_space'
  • gcc -g 用此方法编译后用pwndbg调试会显示C源码
  • one_gad binary -l 2 one_gad binary -level 2,使用1会将所有能用的都打印出来,包括很多苛刻的条件下的shell
  • check libc version 确定libc版本