漏洞狩猎与利用 Dbg1001
漏洞狩猎与利用 Dbg1001
该课程保交付:该课程为开源课程,如果您任然感觉有困难或疑惑,本人可提供有偿的技术咨询,技术支持与录制教学视频。有需求可留言
路径图: https://ost2.fyi/OST2_LP_Vulns_Exploits.pdf
课程: https://p.ost2.fyi/courses/course-v1:OpenSecurityTraining2+Dbg1001_VS_IDE+2021_v1/about
要求:https://p.ost2.fyi/courses/course-v1:OpenSecurityTraining2+Lab_Setup_x86-64_Windows+2021_v1/about
1.下载与安装
- Visual Studio 2019 Community Edition
https://visualstudio.microsoft.com/zh-hans/vs/community/
镜像:https://drive.google.com/file/d/1dt8DtYSPwUOdp0skJAlj618Ya31K-9_9/view
C++桌面开发 -- 取消选择除第一个组件(“MSVC... C++ 构建工具”)之外的所有可选组件
VS 2019教学视频:https://youtu.be/uXilghvGxW0?si=SiBjX1w0l1hFGy3f
- Windows 10 SDK
安装 Windows 10 (10.0.1.19041.685) SDK ( 软件开发工具包), 版本 2004 (目前需要单独安装,因为 VS 自带的版本在后续版本中无法使用)
Windows 10 SDK镜像:https://drive.google.com/file/d/1OrVTjUZ8lx3-s-Qi2u0yOmCWmDQsphjv/view
SDK教学视频:https://www.youtube.com/watch?v=GmyM4XosM8w
2.创建一个新项目
创建新项目 -- 创建一个空的 C++ 项目 -- 项目命名为 Fibber
路径创建 Fibber.sln 为VS的解决方案文件;Fibber.vcxproj 为项目文件
解决方案(类似总部),项目(类似子公司),项目(可包含多个源代码文件)编译可执行二进制文件(.exe、.dll、.sys 等)
2.1将 Fibber.c 添加到项目中
右键“源文件”文件夹,选择“添加”->“新建项...”
选择 .cpp 文件,命名为“Fibber.c”。
粘贴以下源代码到文件中:
#include <stdio.h>
unsigned int fibonacci(unsigned int n){
if(n <= 1){
return n;
}
else{
return (fibonacci(n-1) + fibonacci(n-2));
}
}
int main(){
unsigned int n = 10;
printf("First %d elements of the Fibonacci sequence: ", n);
for(unsigned int i = 0; i < n; i++){
printf("%d ", fibonacci(i));
}
return 0;
}
更改编译为debug和Release(“x64”)
右键单击 Fibber 项目 ,选择“构建”
3.配置编译(针对固定地址)
禁用“地址空间布局随机化”(ASLR)
右键 Fibber 项目(位于文件层次结构中“解决方案”下方),选择 Properties
Linker -> Advanced -> Randomized Base Address 设置为 No(debug x64)
4.源代码调试接口
4.1 设置断点
在代码中设置断点,右键单击第 12 行,下拉选择 Breakpoint -> Insert Breakpoint
出现一个红色圆圈断点,可来回点击开与关
4.2 在调试器中运行程序
按 F5 或者 Menu Bar -> Debug -> Start Debugging
选择“继续”,程序将执行完毕并关闭。要查看程序的输出,请单击第 20 行左侧设置断点。
注意多出来的CMD窗口,点击到前端查看输出
4.3 单步执行代码
Step Into:单步执行该函数
Step Over:允许该函数运行完成,在下一段代码处中断
Step Out:运行完当前函数一直到调用者的函数处中断
另一种单步执行代码的方法:右键单击任意一行代码,然后选择“运行到光标处”,指定的运行行上设置一个临时断点,然后再移除该断点(代码停留行,左侧绿三角同理)
4.4 Visual Studio 窗口指南
自动窗口:函数有十个局部变量,一次单步执行过程中只有一个变量发生更改,则“自动”窗口只显示一个变量,而“局部变量”窗口中则显示全部十个变量。
局部变量窗口:当前代码执行范围内的局部变量的名称、值和类型
监视窗口:用于监视单个内存位置、变量或表达式(例如“n + 10”)
调用堆栈(如未特殊强调,所有堆栈一词,只表示stack,栈):根据代码当前停止的位置显示哪些函数调用了哪些其他函数
断点窗口:显示当前定义的断点及其启用状态
输出窗口:显示执行输出,例如已加载的可执行文件的名称和路径。还显示加载到与可执行文件相同的内存空间中的动态链接库 (DLL)
4.5 添加内存窗口
Menu Bar -> Debug -> Windows -> Memory -> Memory 1
将“内存 1”窗口栏拖到现有标签页之一的“监视 1”旁边
运行程序到第 13 行,并将“n 的地址”( &n )放入内存窗口
执行到第 15 行时,地址 n 处(也就是存储在 n 中的)的值会发生变化,内存窗口中会用红色突出显示发生变化的字节
在“内存 1”窗口的任意位置单击鼠标右键,将显示方式从 1 字节更改为 4 字节
因为 “字节序” 大小端的问题,显示 4 字节值时会交换字节顺序。
小端序:发现0a本来在前面(最小的内存地址),突然变成了 0x0000000a 这种书写格式(即,从内存中读取4个字节,32位进行显示,与从左到右的阅读习惯相反),处理器架构及其相关内存中的主流字节序
大端序:与从左到右的阅读习惯一样,网络协议,网络顺序
文件格式:可以使用两种字节序或混合使用
保存窗口的布局风格:Menu Bar -> Window -> Save Window Layout 命名为OST2
5.配置编译(以便更轻松地进行汇编)
- TL;DR 版本
简而言之,这些设置的目的是不需要理解编译器自行插入的与 C 代码无关的指令
右键单击项目,然后选择“属性”

不要在生产代码中禁用安全检查设置


不要在生产代码中禁用

6.汇编调试接口
查看与源代码关联的程序集,请在断点处停止,右键单击代码并选择“转到反汇编”
此时即可看到汇编代码,同时“自动窗口”(Autos)等窗口将显示类似 rsp 等寄存器的变化
要查看更完整的寄存器视图,请转到“调试”->“窗口”->“寄存器”。
右键单击“寄存器”窗口,可以看到可以启用其他寄存器。现在,请选择“标志”,以显示 RFLAGS 寄存器的解释。
可以像对“内存”窗口那样,将“寄存器”窗口移动到选项卡中。
将内存窗口转换为堆栈视图,但输入地址“rsp”,单击“自动重新评估”按钮,并将列数设置为 1。现在,随着堆栈指针的变化,窗口将始终更新以显示它指向的内存(即堆栈的“顶部”)。
虽然这有助于理解源代码与汇编代码之间的对应关系,但你在平时阅读汇编时,通常是看不到局部变量这类符号名称的。例如在下方显示为 mov dword ptr [n], 0Ah 的地方,你实际上无法直接得知被操作的内存叫做 n。为了更准确地展示汇编代码,请右键点击反汇编窗口,并取消勾选“显示符号名称”(Show Symbol Names)选项。
现在你可以看到,这里不再显示变量名 “n”,而是直接将值 0Ah 写入内存地址 rsp+24h。如果在没有符号文件(Symbols)的地方进行反汇编,这才是你通常会看到的真实样子。你必须自己去推断 rsp+24h 代表哪一个局部变量,以及它是如何被使用的。
在进行汇编调试时,你同样可以设置条件或无条件断点、执行单步跳入/跳过/跳出(step into/over/out),以及进行之前在源码级调试章节中学到的绝大多数其他操作。
现在您可以继续学习任何需要此课程作为先修课程的课程(例如 Arch1001)

浙公网安备 33010602011771号