目录
小记
安装GDB插件gef gdb7.7以上才能用 且程序编译时 -g 才能用gdb调试
#下载三个插件
git clone https://github.com/gatieme/GdbPlugins.git ~/GdbPlugins
对应启动命令:
echo "source ~/GdbPlugins/peda/peda.py" > ~/.gdbinit
echo "source ~/GdbPlugins/gef/gef.py" > ~/.gdbinit
echo "source ~/GdbPlugins/gdbinit/gdbinit" > ~/.gdbinit
查看进程命令 ps -A 查看特定进程 ps -ef | grep hello 查看进程目录 which hello
gdb启动命令:
本地启动:gdb 路径
本地段错误文件启动:gdb 路径 core
ulimit -c 查看当前文件句柄
sudo ulimit -c unlimited 设置无限大存储core文件
attch方式启动 gdb 路径 pid gdb /home/wd/hello 2946
远程启动 gdbserver 0.0.0.0:6666 /path/to/file
gdb调试命令
指定文件方法 命令 xxx.c:xxxx
1.设置函数参数 set args 100 200
set env USER = hcen 设置环境变量
set step-mode 设置单步跟踪 取消命令 set step-mode no
set detach-on-fork off 挂起所有进程 父进程和子进程都卡住 反之xxx on 放行一个进程 detach inferiors <进程编号>
set follow-fork-mode <child/parent> 设置跟随子进程还是父进程 同类 set follow-fork-mode <new/same>
2.查看函数 l /list 显示位置(函数名 行数等) 例:l main 或者 list main
设置显示行数 set listsize 20 //上下显示10行
3.断点 b/break 断点位置(行数 函数名) 例: b 18 或者 b sum 或者 b hello.c:18
info breakpoints 查看当前所有断点
disable 断点号 设置该断点失效
delete 断点号 删除该断点
b 行号 if 条件 条件断点 例: b 22 if i==90
b * 0x8048361 在某个地址上打断点
watch 参数 内存断点 当读取这块内存时断点 用rwatch 参数 移除
4.运行程序 r/run
5.单步运行 ,有函数进入 s/step
6.单步运行,有函数跳过 next /n
ni 执行下一条指令 汇编指令
7.完成函数调用并返回 finish/f
8.运行到函数结束或断点 continue/c
9.查看程序调用堆栈 backtrace/bt
info frame 栈号 查看该栈号的栈帧
frame <int> 查看第多少个栈帧
10.查看内存 examine/x
x/(大小int)(单位b一字节h两个字节w四个字节g八个字节)(进制x f字符串 d i代码。。。)
例:x/20gz 0x.....
vmmap 查看地址段
401000 开头的是 代码段地址
601000 开头的是 堆地址
11.反汇编代码 disassemble
12. 查看命令info
12.1查看寄存器 info registers/i r
第一个参数rdi 第二个参数rsi 第三个参数rdx 第四个参数rcx r8 r9 其余参数在栈里 压栈寄存器rsp
32位程序 直接压栈 寄存器esp 从右到左
上一个函数的返回值储存在寄存器 rax 中
12.2查看变量 info locals /i lo p $rsp 当前运行地址 p $rip 当前运行操作
12.3 查看程序用到的终端模式 infor terminal
重定向输出 out>fileout
指写输入输出的终端设备 tty 例 tty /dev/tty0
12.4 查看当前所有进程 info inferiors 进入一个进程 inferiors <pid>
13.打印信息 print/p 例:p reselt 或者p/s reselt (字符串打印) p/d reselt(十进制打印) p/i reselt(代码打印)
查看数组中的十个元素 p *a@10
14.立即跳出循环 until/u
15.指定符号表 symbol-file hello.symbol
16.设置程序执行路径 path <dir>
show paths 查看程序运行路径
多进程常用命令
set follow-fork-mode parent/chile 设置接下来进入子进程还是父进程
set detach-on-fork on/off 接下来创建的创建的子进程和当前父进程全部卡住
info inferiors 查看所有进程信息
detach inferiors 编号 释放一个进程的卡住
多线程常用命令
thread thread-编号 切换到某个线程
info threads 查看所有线程
thread apply [x-x] :cmd 批量操作线程
set printf thread-events 设置线程是否打印信息
set scheduler-locking off/on/step 除当前线程:off不阻止所有线程 on所有线程锁定 step 同步调试
linux程序发布流程
1.查看文件是否存在符号表: readelf -s/-S hello.gcc
2.剥离符号表操作: objcopy --only-keep-debug hello.gcc hello.debug
2.生成release程序操作: objcopy --strip-debug hello.gcc hello.release //可通过(strip hello.release)再次剥离
3.gdb调试
反调试技术
加壳 / 加花 (upx压缩壳 很low)
模糊头方法