调试器
分类
白盒调试器
源码级别的跟踪和调试功能。
通常只在软件开发阶段
黑盒调试器
汇编代码级别的调试
用户态调试器
1. 主流调试器
Ring3 winDbg OllyDbg gdb
2. 高级调试器
Windows 平台下,智能调试器:支持用户自行编写脚本插件,通过这些插件,完成hook等功能,开发出专用于漏洞挖掘或逆向工程的高级脚本
目前做的比较好的:PyDbg:由Python实现的调试器 Immunity Debugger
3. 断点类别
软断点:将设置断点处的操作码改为INT3终端指令 0xCC
0x12345678: 8BC3 MOV EAX,EBX
0X12345678: CCC3
注意:内存改变代码时,会改变程序的循环冗余校验值(CRC)
恶意软件会校验crc值,来防止逆向
硬件断点:通过寄存器来设置断点,最多4个 防止crc校验
内存断点:改变一个内存区域或内存页的访问权限
权限分类
页可执行
页可读
页可写
保护页:对保护页任何类型的访问将导致一次性异常,之后这个内存页恢复到之前状态。这种类型的内存页在一些场合非常有用:隔离堆栈,或者用于确保一个内存块增长不会超出预定边界
Gdb
获取内核转储
ulimit –c unlimited
gdb –c core ./a.out
ulimit -c unlimited/1073741824 空间大小限制
ulimit -s 堆栈空间限制
generate-core-file生成内核转储文件
gcore 'pidof emacs' gcore pid
objdump 找到相应代码
进程内存分布图
Gdb基本使用方法
带着调试选项编译、构建调试对象
启动调试器
设置断点
显示栈帧
显示变量、寄存器值
执行方法
1. 设置断点
1.1 设置方法
break 函数名
break 行号
break 文件名:行号
break 文件名:函数名
break +偏移量
break -偏移量
break *地址
info b断点信息
1.2条件断点
break 断点 if 条件
condition 断点编号 删除指定编号断点触发条件
condition 断点编号 条件 添加
ignore 断点编号 次数
finish 执行完当前函数暂停
until 执行完当前函数后暂停,用于跳出循环
断点删除/禁用
clear/delete
disable enable
断点命令
commands 断点编号 断点暂停后,自动执行命令
命令
end
1.3监视点
watch<表达式> 表达式变化是暂停
awatch<> 访问或者变化
rwatch<> 访问
delete
hbreak 硬件断点
tbreak 临时断点
thbreak 临时硬件断点
2.显示栈帧
backtrace bt显示所有的栈帧
backtrace N显示开头N个栈帧
backtrace -N显示最后N个栈帧
backtrace full不仅显示栈帧,还显示局部变量
frame
up 上一层栈祯
down
i frame 1 显示栈帧信息
3.显示值
Print 打印变量
info reg显示所有寄存器
p $eax
改变变量的值
set variable 变量=表达式
p/格式 变量 (x 十六进制,d 十进制,u 无符号十进制,o 八进制,t 二进制,a 地址,c 字符 ,f 浮点小数,s 字符串,i 机器语言)
程序指针$eip $pc
x命令,显示内存内容
x/NFU ADDR (N 重复次数,F 格式,U 单位 b 字节、h 半字节、w字、g双字,ADDR 希望显示地址)
disassemble disas
4.单步执行
next n 执行下一行 n i
step p执行到函数内部 s i
continue c 次数
5.attach到进程
attach pid
ps aux|grep sleep
info proc
detach
I proc mapping显示内存映射
6. 反汇编方式查看
disas funcname