gdb
file
指定需要调试的文件
run < xxx
可以重定向把文件作为输入
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
p _IO_2_1_stdout_
p (FILE) stdout
vmmap
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
可以定义每步执行后要干什么
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']
上面两个联合使用效果如下
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