分屏使用:
使用时需要先开 tmux;python exp 中需要如下语句:context.terminal = ['tmux', 'splitw', '-h']
流程控制
| 命令功能 | 命令 | 简写 | 
|---|---|---|
| 重新运行调试的程序 | run | r | 
| 继续运行 | continue | c | 
| 执行下一步 | next | n | 
| 执行N次下一步 | next N | n N | 
| 执行上次执行的命令 | [Enter] | |
| 单步进入 | step | s | 
| 执行完当前函数返回到调用它的函数 | finish | f | 
| 指定程序直到退出当前循环体 | until | u | 
| 强制返回当前函数将会忽略当前函数还没有执行完毕的语句,强制返回。   return后面可以接一个表达式,表达式的返回值就是函数的返回值。  | 
return | |
| 在当前的文件中某一行(假设为6)设定断点 | break 6 | b | 
| 类似于`run,停在main函数的开始 | start | |
断点设置
- break 函数名或者 * 0x地址
若开启pie - 需要使用pwndbg
b *$rebase(偏移)

 
PIE保护下断点
highlighter- scss
b *$rebase(0x地址)
打印Print
| 命令功能 | 命令 | 简写 | 
|---|---|---|
| 打印变量的值 | print var | |
| 打印变量的地址 | print &var | |
| print /x var | 
| print /x var中x的含义 | print /x var中x的选择 | 
|---|---|
| 按十六进制格式显示变量 | x | 
| 按十进制格式显示变量 | d | 
| 按十六进制格式显示无符号整型 | u | 
| 按八进制格式显示变量 | o | 
| 按二进制格式显示变量 | t | 
| 按十六进制格式显示变量 | a | 
| 按字符格式显示变量 | c | 
| 按浮点数格式显示变量 | f | 
内存显示
x /<n/f/u> |$esp
例如:x /10dw arr
n 显示的长度
| f 表示显示的格式 | f的选择 | 
|---|---|
| 按十六进制格式显示变量 | x | 
| 按十进制格式显示变量 | d | 
| 按十六进制格式显示无符号整型 | u | 
| 按八进制格式显示变量 | o | 
| 按二进制格式显示变量 | t | 
| 按十六进制格式显示变量 | a | 
| 按字符格式显示变量 | c | 
| 按浮点数格式显示变量 | f | 
| u 表示的字节方式 | u的选择 | 
|---|---|
| 表示单字节 | b | 
| 表示双字节 | h | 
| 表示四字节 | w | 
| 表示八字节 | g | 
其他
highlighter- nim
x/s addr 查看addr处的字符串
x/b addr 查看addr处的字符
x/i addr 查看addr处的反汇编结果
x/10wx
x/10gx
查看寄存器
- i r [a]|[eax]
 
修改寄存器
- set $eax=0x11
 
修改地址内容
| 无符号 | 修改字节数 | 
|---|---|
| set {unsigned char}地址 =值 | 一个字节 | 
| set {unsigned short}地址 =值 | 两个字节 | 
| set {unsigned int}地址 =值 | 四个字节 | 
| set {unsigned long long}地址 =值 | 八个字节 | 
| 有符号 | 修改字节数 | 
|---|---|
| set {char}地址 =值 | 一个字节 | 
| set {short}地址 =值 | 两个字节 | 
| set {int}地址 =值 | 四个字节 | 
| set {long long}地址 =值 | 八个字节 | 
- 或者set (类型) =
 
调试技巧
方案一
启动程序之后,再用gdb调试
gdb attch
python中pause()进行中断
方案二
在python中gdb.attach(p,'command') 如:gdb.attach(p,'b *地址')
堆相关指令
| 查看分配的堆 | heap [-h] [-v] [-s] [addr] (chunk头开始) | 
| 查看各种bins | bins [addr] | 
| 16进制查看 | hexdump 地址 显示的字节数 | 
| 查看各个bins的情况 | heapinfo (常用) | 
| 查看堆的基地址 | heapbase | 
| 查看用户使用的堆的使用情况 | parseheap (chunk头开始)(par简写)(常用) | 
| 查看chunks内存 | vis_heap_chunks | 
| 查找fake_chunks | find_fake_fast &main_arena | 
查看栈信息
| 含义 | 指令 | 
|---|---|
| 打印当前函数参数和对应值 | info args | 
| 打印当前函数局部变量和对应值 | info locals | 
| 打印详细的栈信息,主要以程序的虚拟地址信息为主 | info frame | 
| 向栈的下面移动n层 | down [n] | 
| 向栈的上面移动n层 | up [n] | 
| 打印当前调用栈的信息,n可正可负。   表示只打印栈顶上n层的栈信息或栈底n层信息。  | 
backtrace [n] | 
其他指令
| 指令含义 | 指令 | 简写 | 
|---|---|---|
| 显示当前gdb断点信息 | info breakpoints | info b | 
| 反汇编该函数或地址 | disassemble 函数名或地址 | disass | 
| 用栈的方式查看 | telescope 地址 | tele | 
| 查看区段 | vmmap | |
| 搜索字符串 | searchmem 字符串 | |
| 查看子命令帮助 | help x | |
| 转换为intel格式 | set disassembly-flavor intel | |
| 转换为att格式 | set disassembly-flavor att | |
| 查看符号地址 | info address 符号 | |
| 查看puts的got表地址 | info address puts@got.plt | |
| 查看libc中system函数地址 | info address system | |
| 查看内存映射 | info proc mappings | |
| 生成字符 cyclic 200 生成200个有序字符 | 
