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的状态

/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 # 设置动态库解析器