gdb

  • file

    指定需要调试的文件

    image-20200630202109418
  • run < xxx

    可以重定向把文件作为输入

    image-20200630202335521 image-20200630202347150

  • break 打断点

    在有PIE的题目中可以使用vmap看程序的实际基地址然后在IDA中对基地址进行设置

  • delete 删除断点

  • step/next

  • stepi/nexti si是汇编指令的步入,ni是c指令层面的步入

  • finsh 结束当前调用,程序运行时一般有多层函数调用

  • print 可以查看变量

    eg:print * addr

  • x

    eg:x/xg 会当成8个字节去打印 g是大的意思,x是十六进制

    ​ x/10xg 会打印10个8字节

    ​ x/xw 会当成4个字节去打印 32位里w是一个字

  • x/i 将地址作为指令打印

    eg:x/i 0x7ffff7edd461

  • x *addr 星号表示解引用

  • x $reg 查看寄存器

  • p stdout
    image-20200630205807621

  • p _IO_2_1_stdout_

    image-20200630205957242
  • p (FILE) stdout

    image-20200630210346216
  • vmmap

    image-20200630210636255
  • info all-registers 查看所有的寄存器的值

  • set *addr = val

    将这个地址上的值修改为val的值

  • strace

    跟踪调用过程

    eg: strace ./rop

  • set args

    设置参数,有些程序需要带参数执行,可以使用这个指令

  • set follow-fork-mode

    在调试多进程的程序时使用,有的时候可能会fork,假如不想理会子进程就设置为parent

    eg: set follow-fork-mode parent

    ​ set follow-fork-mode child

  • set environment LD_PRELOAD=./env.so

    可以重写.so文件,替换某些函数,但是重写的时候要保证函数的结构是一样的

    编译指令 gcc -shared -fPIC -o copy.so time.c

  • def hook-stop

    可以定义每步执行后要干什么

    image-20200701111838529
  • def hook-xxx

  • target remote:1337

    github项目arm_now可以快速搭建MIPS调试环境,使用如下命令开启环境

    1
    arm_now start mips32el --sync --redir tcp:1337:1337

    --sync是将当前目录复制并加载到虚拟环境中,--redir tcp:1337:1337将指定端口转发到本机方便之后的gdb调试

  • zsh/sh

    可以在gdb中打开shell

  • attch pid

    可以用来对正在运行的进程进行调试

pwndbg

  • pwndbg

    显示有哪些功能

  • heap

  • bins

  • arena

  • context

  • retaddr

  • checksec

  • cyclic

  • hexdump

  • search --writeable --qword 0x1

    比如在free tcache的时候需要后面是0x1,所以可以使用这个来搜索

  • dump memory copy 0x400000 0x401000

    将0x400000到0x401000的内存内容dump到copy这个文件中

  • bd/be

    breakpoint disable

    breakpoint enable

    info breakpoint可以查看断点

    eg: bd 1 禁止使用第一个断点

  • aslr

    查看是否启用aslr

    aslr on alsr off

scripts

  • gdb.attach(r)

  • context.terminal = ['tmux', 'sp', '-h']

    上面两个联合使用效果如下

    img
  • pause()

    也可以使用raw_input()

  • cyclic(), cyclic_find()

  • p32(), p64()

  • ljust(), rjust()

    eg: recv_content.ljust(8, '00')

  • alsr

    eg:p = process('./pwn', level='debug', alsr=False)

others

  • readelf -a libc.so | grep func_name

  • sed -i 's/alarm/isinf/g' bin_name

    用来patch alarm函数,避免调试一下之后程序自动退出了

    将alarm函数换成isinf函数

  • diff A B

    查看A和B两个文件是不是一样的

  • 中断指定,可以用来代替shellcode来判断shellcode是否会被执行

  • villoc

    是一个可视化的堆的项目,在github上搜索

  • gcc -g

    编译之后可以给出debug的信息

  • one_gadget libc.so -l 2

    -l 是level的意思,默认是0,2的话可以显示出更多的one_gadget

  • 检查libc的版本

    首先ldd查看执行的程序使用的libc

    ldd pwn

    然后猜测libc版本,下面的代码就是猜测是否是2.7的libc

    readelf -a /lib/x86-64-linux-gu/libc.so.6 | grep 2.7

  • patchelf --set-interpreter /opt/libs/2.27_amd64/ld-2.27.so ./patchelf

  • patchelf --replace-needed libc.so.6 /opt/libs/2.27_amd64/libc-2.27.so ./patchelf

cp /glibc/2.27/64/lib/ld-2.27.so /tmp/ld-2.27.so patchelf --set-interpreter /tmp/ld-2.27.so ./test LD_PRELOAD=./libc.so.6 ./test