1、WinDbg介绍

WinDbg是一款Windows强大的调试器,可以调试0和3环的程序。

在实际开发中,可以调试我们的错误程序,从而定位关键代码,进行程序代码修复。

WinDbg 是一种调试器工具,由微软公司开发,用于分析和调试 Windows 操作系统和应用程序。它提供了强大的调试功能,可以帮助开发人员识别和解决各种软件问题。

以下是 WinDbg 的一些主要特点和功能:

  1. 内核级和用户级调试支持: WinDbg 可以用于内核级别的调试(如 Windows 内核、驱动程序等)和用户级别的调试(如应用程序、DLL 等),使开发人员能够全面分析和调试整个系统栈。
  2. 符号和源代码支持: WinDbg 可以与符号文件(PDB 文件)结合使用,以获得更详细的调试信息,包括函数名、变量名和源代码行号等。这对于理解和追踪代码执行路径非常有帮助。
  3. 调试器扩展: WinDbg 支持通过扩展插件(例如 JavaScript 脚本)来增强其功能。这些扩展可以自定义命令、自动化任务、数据分析等,使调试过程更高效和灵活。
  4. 远程调试: WinDbg 支持在远程计算机上进行调试,这对于分析在另一台计算机上发生的问题非常有用。
  5. 内存分析: WinDbg 可以帮助分析内存转储文件(如 minidump、完全转储等),以了解程序崩溃或异常终止的原因。
  6. 性能分析: WinDbg 提供了一些性能分析工具和命令,可以帮助开发人员识别和解决性能瓶颈问题。
  7. 脚本和自动化: WinDbg 具有自己的脚本语言(类似于 JavaScript),允许开发人员编写脚本来执行自动化任务,例如批量调试、数据提取等。

WinDbg 是一款功能强大且灵活的调试器工具,可用于分析和解决各种 Windows 软件问题。它在软件开发、故障排除和性能优化方面都扮演着重要角色,并广泛应用于开发人员和系统管理员的工作中。

2、Windbg安装

【WinDbg】学习以及在CTF中解题_Windows

Windbg 10需要下载WindowsSDK 然后进行安装即可。

【WinDbg】学习以及在CTF中解题_WinDbg_02

安装这一步属于基础,按照搜索到的步骤进行安装即可

【WinDbg】学习以及在CTF中解题_Windows_03

Windbg 10 自带了帮助文档

【WinDbg】学习以及在CTF中解题_Windows_04

3、dmp文件介绍

.dmp 文件是一种用于存储系统或应用程序崩溃时的信息的内存映射文件 dmp 文件通常包含了在崩溃或异常事件发生时系统或应用程序的内部状态信息和堆栈跟踪信息,它们对于诊断问题和进行调试非常有用。

当程序运行到某些重大错误的时候,windows会帮我们生成一个.dmp文件,这里的dmp就是文件进程的内存镜像,可以把程序的执行状态通过调试器保存在其中。

帮助网安学习,全套资料S信免费领取:

① 网安学习成长路径思维导图

② 60+网安经典常用工具包

③ 100+SRC分析报告

④ 150+网安攻防实战技术电子书

⑤ 最权威CISSP 认证考试指南+题库

⑥ 超1800页CTF实战技巧手册

⑦ 最新网安大厂面试题合集(含答案)

⑧ APP客户端安全检测指南(安卓+IOS)

可以使用任务管理器进行生成

【WinDbg】学习以及在CTF中解题_调试器_05

创建转储文件,即可生成对应的dmp文件

4、pdb文件介绍

.pdb 文件是用于存储调试信息的程序数据库文件。 pdb 文件包含了有关源代码的符号信息,如变量名称、函数名称、类型信息以及源代码文件和行号的映射。这使得调试器能够将二进制文件中的地址映射回源代码。

5、Windbg基础命令

提供debugger.chm文件(下载安装Windbg10自带)

debugger.chm 命令已经很全了,这里只总结常用的指令。

windbg的指令分成以下几类

  • 标准命令
  • 元命令
  • 扩展指令

标准命令相当于是内建在windbg中的默认指令。 元命令则是提供给标准指令中没有的指令,调用时开头要加上.符号。 扩展指令则是用于实现针对特定目标的调试功能,使用前要加上!符号,其完整的调用格式为:

!nameofExtentModule.nameofExtentCommand 参数

其中如果扩栈模块已经加载了,那么nameofExtentModule.不是必须的,windbg会直接查找。

【WinDbg】学习以及在CTF中解题_Windows_06

5.1 执行、调试相关

dt

The dt command displays information about a local variable, global variable or data type. This can display information about simple data types, as well as structures and unions.

dt命令看可以显示局部变量、全局变量或数据类型的信息。它也可以仅显示数据类型。即结构和联合(union)的信息。

#查看当前线程块
dt _teb
d 查看数据

默认格式如下

d [type] [address range]

d这个命令能够查看指定地址和内存的内容,其中常用的有dd(使用双字节来查看内存内容),如:

dd 77400000
!peb

可以查看当前进程中的peb的基本情况。

【WinDbg】学习以及在CTF中解题_CTF_07

bp

The bpbu, and bm commands set one or more software breakpoints. You can combine locations, conditions, and options to set different kinds of software breakpoints.

指令格式如下

bp <address>

常见的下断点的方式。对应的清除断点的方式为bc num,而列出断点的方法为bl

g

最基本的指令,运行当前程序。

u

将指定的地址反汇编:

u[u|b] address(.表示当前的程序执行地址)
uu Address L[Length]

其中uu和ub可以指定当前反汇编的长度(暂时没看出什么区别,似乎是ub的话使用.会自动计算从函数开始的地址进行汇编)。可以使用以下的语法进行长度的指定

使用L表示后面的数字表示的是长度

r

【WinDbg】学习以及在CTF中解题_调试器_08

查看当前的寄存器 同时可以修改当前的寄存器,比如说:

r @eax=1

将当前的eax寄存器的值修改成1

ed

ed address

ed [address][content]

将当前的内存修改成指定值 例如

ed 08041000 11111111

将地址08041000处的内容修改成11111111

p

常见指令,单步步过。除此之外还有:

  • p 2 // 2为步进数目
  • pc // 执行到下一个函数调用处停下 【Step to Next Call】
  • pa 7c801b0b // 执行到7c801b0b地址处停下 【Step to Adress】
t

【WinDbg】学习以及在CTF中解题_Windows_09

单步步入

k

查看栈帧调用顺序

【WinDbg】学习以及在CTF中解题_调试器_10

5.2 调试辅助相关

.sympath

表示当前的符号加载情况。符号能够帮助我们更加方便的分析程序。

.sympath+ D:\Filename

将D:\Filename添加到符号查找的路径中。 关于符号,其中lm指令可以检查当前的文件中是否加载了符号文件:

【WinDbg】学习以及在CTF中解题_CTF_11

  • deffered:表示延迟绑定
  • pdb symbols:表示已经加载当前符号
.load
.load dllname

【WinDbg】学习以及在CTF中解题_CTF_12

导入指定名字的dll文件,常常用于导入插件

5.3 漏洞利用相关

!py mona

mona是一个好东西哈,可以用来生成ROP,查找Gadget,进行漏洞挖掘等等。

生成ROP Chain

!py mona rop -m "module"

利用module生成ROP Chain

6、实战:windbg分析题目

这里使用了WindbgPreview来分析这道dmp

题目描述:

赛题描述:explorer.exe进程已经被木马感染了,现已经获取explorer.exe进程的dump文件,尝试从DUMP文件中找到flag

打开的效果:

【WinDbg】学习以及在CTF中解题_调试器_13

使用第一条命令:

!analyze -v

!analyze -v 是 WinDbg 调试器中的一个命令,用于自动分析崩溃的原因。这个命令会执行一些步骤来帮助你找到崩溃的根本原因,包括输出调用栈、异常信息、可能引起问题的模块以及其他相关信息。

!analyze 是命令,-v表示详细输出的参数

【WinDbg】学习以及在CTF中解题_CTF_14

发现没什么信息,尝试使用 命令 lm,列出当前加载的模块

根据题目描述,感觉像是注入了恶意dll

输出了很多结果

【WinDbg】学习以及在CTF中解题_WinDbg_15

这里有个小技巧,加载了对应符号的pdb,可以先排除

【WinDbg】学习以及在CTF中解题_Windows_16

这么多dll,怎么分析?

这里再教一个小技巧,系统dll的地址一般都很高。

【WinDbg】学习以及在CTF中解题_CTF_17

这里就有一个很可疑的dll

【WinDbg】学习以及在CTF中解题_调试器_18

地址这么低,和系统dll的地址显得格格不入

猜测这是可疑dll,使用命令进行分析

start    end        module name
10000000 1000e000   stolen     (deferred)

将光标移动到stolen,windbgpreview会输出一段信息:

或者运行命令:lmv m stolen

lmv m 是 WinDbg 调试器中的一个命令,用于显示指定模块的详细信息。该命令可以帮助你查看模块的基地址、文件名、调试符号等信息。
0:030> lmDvmstolen
Browse full module list
start    end        module name
10000000 1000e000   stolen     (deferred)           
    Image path: C:\Users\Administrator\Desktop\stolen.dll
    Image name: stolen.dll
    Browse all global symbols  functions  data
    Timestamp:        Thu Apr 20 11:33:18 2017 (58F82BFE)
    CheckSum:         0000E4F8
    ImageSize:        0000E000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4
    Information from resource tables:

尝试寻找:C:\Users\Administrator\Desktop\stolen.dll

发现没有。。。

【WinDbg】学习以及在CTF中解题_调试器_19

在内存中也没有数据,因为还没映射

那么我们就查看整个内存空间布局,看看能不能找到相应的映射数据,(在dll对应的范围内)

!vadump

!vadump 是 WinDbg 调试器中的一个命令,用于显示虚拟地址空间 (Virtual Address Space) 的详细信息。
该命令将输出当前进程的虚拟地址空间中每个 VAD(虚拟地址描述符)的信息。
VAD 是操作系统内核用于管理进程虚拟内存的数据结构之一。
通过使用 !vadump 命令,可以查看每个 VAD 的起始地址、结束地址、保护标志、镜像文件名等信息。
BaseAddress: 10001000
RegionSize:  000062f4

【WinDbg】学习以及在CTF中解题_Windows_20

【WinDbg】学习以及在CTF中解题_Windows_21

flag如下:

flag{acaa16770db76c1ffb9cee51c3cabfcf}