GDB安装
apt-get install gdb
安装GDB增强工具 (gef)
- GDB的版本大于7.7
- wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh
- 确保网络连通 并且成功更新ubuntu (更新source.list 使用apt-get update)
安装GDB增强工具 (pwndbg)
-
git clone https://github.com/pwndbg/pwndbg
-
cd pwndbg
-
sudo #./setup.sh
GDB启动方式
- gdb 文件名
- gdb 文件名 core(错误文件日志)
- set args -c 0 -i 123456
readelf -h查看文件头 其中的entry point address为程序起始地址
GDB调试
1.基于源码的调试
基础知识
- RIP 执行指针
- ESP 栈顶指针
- EAX当前栈指针位置
- EBP基址指针
基础指令:
-
vmmap 程序中关键地址段
-
nexti 汇编下一行
-
n 下一行
-
u 跳出循环
p/x变量名 查看地址 p/d 以十进制打印值 p *变量 查看结构体,地址 p *(db_list_t * )变量名 p &变量名 查看该变量地址 p 变量名=x 直接复制
-
s 进入函数内
-
b 行数 跳转
-
b 函数名 跳转
-
set args 参数… 设置参数
-
l main 查看main函数
-
break (b) 函数名,行号 打断点
-
shell 跳转至shell
-
exit 退出shell
-
r 运行
-
x/20wx(32位,gz为64位)查看20个16 进制的字节
x/s 以字符串方式查看 x/sa 变量名 查看字符串 s为字长 b 比特 w 4字节 g 8字节 a为进制 d是十进制 f,z十六进制 x八进制
-
i r查看所有的寄存器的值
-
bt 查看进入的函数的调用关系
-
info frame 0 查看当前函数调用栈
-
x/i 查看二进制代码
-
l 名字 查看具体代码
-
c 跳至下一断点
-
b 变量 if 条件 条件断点
条件断点
若在for中循环100次,需要在第50次循环停下来
b 行号 if (i==50)
多进程
follow-fork-mode 设置进程模式
detach-on-fork 是否只调试子进程
防破解的保护机制
-
ASLR与PIE ASLP为系统层面,ASPR为指令地址随机化(不开启偏移地址是固定的),PIE是在GCC编译时自行决定是否开启
-
Canary 栈保护机制,在函数返回时校验cookie,从而判断是否栈溢出
-
NX 栈不可执行
-
RELRO
-
加壳
段错误(核心已转储)
查看core文件,设置方法:切换至root下,输入**”ulimit -c unlimited “**命令。
在gdb中添加core文件去调试程序:gdb mult_proxy core
nc-lvp 端口号 监听端口