windbgExploit开发系列教程-Windbg
恢复执行(并在第一次触发的断点上停止)输入如下:g
$teb或@$teb(TEB的地址)
查看寄存器信息,输入如下:r
输入如下命令在位于0x4110a0地址的指令上设置断点:
还有其它两个用于exit函数的命令:
执行到single-chance和second-chance的异常处将会使Windbg中断 。它们并非是不同的异常类型。执行到异常处时,WinDbg将停止执行 ,并提示该为single-chance异常。 Single-chance意味着异常事件还没被发送到被调试的程序。当我们恢复执行时,WinDbg将异常事件发送到被调试的程序。如果被调试程序不处理异常,WinDbg将再次停止执行并提示此处为second-chance异常。
‘u‘ 是unassemble的缩写并且‘L‘可让指定你想查看信息的行数.列出调用栈(call stack)可以使用k
使用特定的CPU寄存器设置硬件断点,它比软件断点更通用.事实上,它可中断执行或内存访问.硬件断点不会修改任意代码,甚至带有self modifying code。不幸的是,最多只能下4个硬件断点。
软件断点:
查看特定寄存器信息,例如eax和adx,输入:r eax, edx
可以用许多种方式指定范围:
.server tcp:port=1234
ba mode size address passes (deult=1) mode 可以是 ‘e‘ (用于执行 ‘r‘ (用于读取存储器 ‘w‘ (用于写存储器
这里,使用星号来描绘我们已列出的如上所有的变化,并且方框内应指明所选的范围。如果没有选好范围,那么在使用d命令展示一部分数据后,将展示内存部分的数据。
bp 4110a0
打印前三行EIP指向的指令,用命令如下:u EIP L3
本地调试
记录:使用tt命令会执行到函数内,如果你想到达当前函数的ret指令,那么改为使用pt命令。 pt和gu命令的不同点在于,使用pt命令将会在ret指令上中断,使用gu命令将会在ret指令后的下一条指令上中断。
在我们测试EMET5.2时,我们需要忽略single-chance的单步异常(single step exceptions)。用如下命令实现: sxd sse
$peb或@$peb(PEB的地址)
硬件断点
最简单的形式如下,命令格式为:
tt (trace to next return):等价于重复使用’t’命令并且在执行过程中的第一条ret指令上停止执行。 pt (step to next return):等价于重复使用‘p’命令并且在执行过程中的第一条ret指令上停止执行。
至少使用如下两个选项来远程调试程序
通过File→Attach to a Process附加到某一正运行的进程
查看异常类型的列表:sx用sxi命令忽略某一异常:sxi ld使用该命令可让第一次输入的命令失效。
逐步执行有至少三种类型:
pa/ta address: step/trace 到地址。 pc/tc: step/trace 到 下一条 call/int 指令。 pt/tt: step/trace 到下一条 ret (discussed above at point 3)指令。 pct/tct: step/trace 到下一 条call/int 或 ret指令。 ph/th: step/trace 到下一分支的指令。
通过File→Open Executable运行新进程以进行调试
可以调试某一新进程或某一正在运行的进程:
当“int 3”指令被执行时,断点即被触发,那么执行将会被停止,且WinDbg通过重置它的首字节来重置该指令。
这有一些伪寄存器的范例:
这是“go“的缩写. 运行直到到达某地址 (含有代码 ), 输入:g code location
WinDbg内将会在指定的上设置软件断点(如‘bp’),但此处的断点被触发后将会被删除.主要原因是使用‘g’设的是一次性软件断点.
在WinDbg中可支持多种伪寄存器(含有某些值). 用前缀‘$‘来指明其是伪寄存器.在使用寄存器或伪寄存器时,可以添加前缀’@’,这样做可让WinDbg确定该前缀之后的内容为某一寄存器而不是某一符号。
输入 .hh d 来查看其它变量。 ‘d’命令用相同的格式展示数据,正如大多数的d命令那样(或如果不是单一数据则使用db)。
这些命令的(简化)格式为:d [range]
远程调试
在某指令上设置断点时,WinDbg将指令的第一字节保存于内存并用0xCC覆盖它(操作码为”int 3”)。
步进/(命令:t) 该命令中断每条指令的执行.如果执行到call指令或int指令,那么该命令将各自在调用函数的第一条指令或int handler上中断。 步过 (命令: p) 该命令能让每条指令(没有calls或ints,等等)执行后中断,如果你刚好执行到call或int指令,那么会在call或int指令执行后中断 步出 (命令: gu) 该命令(go up) 能让WinDbg恢复程序的执行,并且能在下一条ret指令执行后中断。在exit函数中经常使用到该命令。
1 如果你已在机器A上本地调试某一程序,那么使用如下命令(选择你想要的端口):
这里是包含‘p‘ 和‘t‘命令的不同形式:
$thread或@$thread(当前线程)