winpwn入门
前言
nkctf刚好有一道winpwn的题,题目比较简单就顺便学了一下,主要是一些调试还有攻击的技巧
参考:
安装checksec
https://github.com/Wenzel/checksec.py
到他的releases下载checksec.exe
安装winserver
https://github.com/Ex-Origin/win_server
这个就像搭建pwn题一样,把exe给映射到一个端口上
1 |
|
如上git clone之后即可使用,用法:.\win_server.exe a.exe 1234
就可以把a.exe给映射到1234端口上,试着用nc连接一下,发现可以正常的执行程序
这样就可以正常使用pwntools去做winpwn了,同样也方便使用ida调试程序
winpwn保护机制
NX:这个在win上其实是DEP,堆栈不可执行保护
Canary:这个在win上其实是GS,可能这个工具的开发者为了让我们更好理解才写了Canary,但是需要注意的是这个工具的canary检测可能检测不准
ASLR:通俗讲就是地址随机化,让exe和dll的地址全部随机,所以就有了大名鼎鼎Heap Spray(堆喷)利用技术,Heap Spray是在shellcode的前面加上大量的slide code(滑板指令),组成一个注入代码段。然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得进程的地址空间被大量的注入代码所占据。然后结合其他的漏洞攻击技术控制程序流,使得程序执行到堆上,最终将导致shellcode的执行。
Dynamic Base:程序编译时可通过/DYNAMICBASE编译选项指示程序是否利用ASLR的功能
High Entropy VA:如果指定此选项,则当内核将进程的地址空间布局随机化为 ASLR 的一部分时,兼容版本的 Windows 内核可以使用更高的熵。 如果内核使用更高的熵,则可以将更多的地址分配给堆栈和堆等内存区域。 因此,更难猜测特定内存区域的位置。当该选项打开时,当这些模块作为 64 位进程运行时,目标可执行文件和它所依赖的任何模块必须能够处理大于 4 GB 的指针值。
SEH:结构化异常处理(Structured Exception Handling,简称 SEH)是一种Windows 操作系统对错误或异常提供的处理技术。SEH 是 Windows操作系统的一种系统机制,本身与具体的程序设计语言无关。SEH 为Windows的设计者提供了程序错误或异常的处理途径,使得系统更加健壮
SafeSEH:为了防止攻击者通过覆盖堆栈上的异常处理函数句柄,从而控制程序执行流程的攻击,在调用异常处理函数之前,对要调用的异常处理函数进行一系列的有效性校验,如果发现异常处理函数不可靠,立即终止异常处理函数的调用。不过SafeSEH需要编译器和系统双重支持,缺少一个则保护能力基本就丧失了
Force Integrity:强制签名保护
Control Flow Guard:控制Flow防护 (CFG) 是一项高度优化的平台安全功能,旨在打击内存损坏漏洞。 通过严格限制应用程序可以从何处执行代码,利用漏洞(如缓冲区溢出)执行任意代码会更加困难
Isolation:隔离保护,默认会开启
Authenticode:签名保护
ida调试
ida直接调试程序
先F2下个断点
F9选择Local Windows debugger,然后OK就行了
这里就可以开始调试了
结合exp调试
这里选择attach to process,然后用前面的winserver把服务跑起来,在虚拟机里面跑exp,连接上程序,然后选择对应的进程就可以调试了
这里可以看到已经调试到我们exp跑的对应的进程里面去了
例题:NKCTF2024 签到
明显的有格式化字符串和栈溢出漏洞,因为不太清楚winpwn的libc的格式,所以这里没用格式化字符串漏洞去泄露libc,这里笔者选择了先用格式化字符串漏洞泄露出canary,然后rop泄露出puts的真实地址(这里需要注意的是winpwn不知道为什么无法使用%x$p),必须输入一长串的%p才能够泄露
然后题目也给了msvcrt.dll,用ida把puts,system,cmd.exe的偏移都找出来,然后直接写rop就行了
1 |
|
这里还要注意的是需要把debug打开来,然后用type flag.txt才能看到flag,不知道是不是因为编码格式的问题,不开debug是看不到打印出来的字符串的