8

【Pwn 笔记】Windows Pwn 环境搭建

 2 years ago
source link: https://binlep.github.io/2020/03/26/%E3%80%90Pwn%20%E7%AC%94%E8%AE%B0%E3%80%91Windows%20Pwn%20%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【Pwn 笔记】Windows Pwn 环境搭建

膜 EX 师傅和 Byzero512 师傅

检查程序保护的方法

这里要用到的脚本是 winchecksec,在 github 上面开源

地址为:https://github.com/trailofbits/winchecksec

在本地起端口的方法

安装 win_server

这里使用 EX 师傅的脚本,项目源码地址:https://github.com/Ex-Origin/win_server

用 nc 连上端口后就可以用 Windbg 来调试附加进程,即:Attach to a Process(快捷键是 F6)

用这个方法的话可以先在脚本的前面加个输入函数,来中断程序的运行,之后断点断在要调试的程序内第一个输入函数的后面即可

不过我不推荐用这个方法调试,这个工具最适合的还是起端口

安装 Windbg

我的电脑不支持 Windbg 首页发布的 Windbg 和 Preview 版本

因为我的电脑的一个组件的版本略高Kit Windows 10.0.18362.1,首页的 Windbg 支持Kit Windows 10.0.18362.0

支持Kit Windows 10.0.18362.1的 Windbg 的下载地址:

https://download.microsoft.com/download/4/2/2/42245968-6A79-4DA7-A5FB-08C0AD0AE661/windowssdk/Installers/X86%20Debuggers%20And%20Tools-x86_en-us.msi
https://download.microsoft.com/download/4/2/2/42245968-6A79-4DA7-A5FB-08C0AD0AE661/windowssdk/Installers/X64%20Debuggers%20And%20Tools-x64_en-us.msi

用 winpwn 调试程序

安装 winpwn

这里使用的是 Byzero512 师傅所写的脚本

项目开源地址:https://github.com/Byzero512/winpwn

现阶段改脚本需要改一些参数,才能适合于自己的环境

安装 TWindbg

原本的 Windbg 看起来很费劲,所以这里装插件来适应,这个插件是把 Windbg 的命令窗口改成类似 gdb-peda 的样式,便于调试

我一般是放 Memory(内存)窗口在上面,Command(命令)窗口在下面,内存窗口用于看各地址周围详细情况

项目地址:https://github.com/bruce30262/TWindbg

按照步骤,先安装 pykd-ext

https://githomelab.ru/pykd/pykd-ext/-/wikis/Downloads

点击上方链接下载最新版本的 pykd-ext,之后解压

再把对应的 pykd.dll 文件分别复制到 Windbg x86 和 Windbg x64 的 winext 文件夹里即可

之后我发现在 Windbg 里安装 pykd 会出错,错误如下:

ValueError: signal only works in main thread

而且默认用的 pip 是 Python 3 的,因为 pykd 在以后的版本里更倾向于能继续发展的 Python 3

所以这里我采用下载源文件包的形式来安装 pykd

下载地址在:https://githomelab.ru/pykd/pykd/-/wikis/home

选择 Last Release 来进行后续的下载,之后安装即可:

pip3 install .\pykd-0.3.4.12-cp38-none-win_amd64.whl

最后把 TWindbg 文件夹里面的 TWindbg 文件夹复制两份分别到 Windbg x86 和 Windbg x64 的 winext 文件夹里即可

安装 Cmder

其实改一改脚本的话用不到这个东西,原因写在下面的文章里

但是我下下来以后发现这个东西真的是太香了,所以就也写这了

下载地址:https://cmder.net/

如果不需要过多的 linux 命令和 cygwin-gcc 的话就没有必要安装 Cygwin

而且这玩玩还自带 git 和 git bash,所以 git 一系列的东西也可以卸载了

这里再添加两个脚本,用来将用右键就可以启动 Cmder 的功能写入注册表的文件和删除这个操作的文件

ContextCmder-Enable(这个要按自己的路径改改).reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\Cmder]
@="Open Cmder Here"
"Icon"="C:\\tools\\cmder\\Cmder.exe,0"

[HKEY_CLASSES_ROOT\Directory\Background\shell\Cmder\command]
@="\"C:\\tools\\cmder\\Cmder.exe\" \"%V\""

[HKEY_CLASSES_ROOT\Directory\shell\Cmder]
@="Open Cmder Here"
"Icon"="C:\\tools\\cmder\\Cmder.exe,0"

[HKEY_CLASSES_ROOT\Directory\shell\Cmder\command]
@="\"C:\\tools\\cmder\\Cmder.exe\" \"%1\""

ContextCmder-Disable.reg

Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\Directory\Background\shell\Cmder]
[-HKEY_CLASSES_ROOT\Directory\shell\Cmder]

用 gdb 调试程序(失败)

安装 mingw-gdb

这玩玩可以在这下载:

https://nchc.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe

安装 peda-windows(wibe)

安装作者写的脚本:https://github.com/Byzero512/peda-windows

不要用 .gdbinit,因为可能无效,直接把对 wibe 的调用写在 .winpwn 文件里即可

作者的脚本有些小缺陷,就是 gdb 调试的时候,gdb 所在的路径不能有空格

我们略作修改,使其支持空格路径,详情写在下面的使 gdb 支持空格路径

别忘了装里面的 vmmap

更改 HOME 环境变量为 HOMEPATH

之前作者说要用 Cmder 才能调试的原因是 Cmder 有 HOME 环境变量,但是正常情况下是没有的

正常情况下这个环境变量的名字是 HOMEPATH

更改如下,找到 var.py 脚本,路径大致如下:E:\Python27\Lib\site-packages\winpwn\var.py

将以下脚本替换:

winpwn_init=os.environ['HOME']+'\\.winpwn'
winpwn_init=os.environ['HOMEPATH']+'\\.winpwn'

之后就能随意运行调试文件了

使 gdb 支持空格路径

找到 misc.py 文件,路径大致如下:E:\Python27\Lib\site-packages\winpwn\misc.py

做如下修改:

def run_in_new_terminal(command, terminal = None, args = None):
if terminal is None:
if (context.terminal):
terminal=context.terminal
else:
terminal=['ConEmu.exe','-Reuse','-run']
if isinstance(args, tuple): # args associety with tmminal not process
args = list(args)
if args is not None:
argv=terminal+args
else:
argv=terminal
# print(argv,command)
if isinstance(command,str):
argv+=[command] # [terminal,args,command]
elif isinstance(command,(list,tuple)):
argv+=list(command)
ter=subprocess.Popen(argv)
return ter
def run_in_new_terminal(command, terminal = None, args = None):
if terminal is None:
if (context.terminal):
terminal=context.terminal
else:
terminal=['ConEmu.exe ','-Reuse ','-run ']
if isinstance(args, tuple): # args associety with tmminal not process
args = list(args)
if args is not None:
argv=terminal+args
else:
argv=terminal
# print(argv,command)
if isinstance(command,str):
argv+=[command] # [terminal,args,command]
elif isinstance(command,(list,tuple)):
argv+=list(command)
ter=subprocess.Popen(''.join(argv))
return ter

复制 github 项目上 winpwn 里面的 .winpwn 文件

先写好调试器的路径,再将其复制到 HOMEPATH 所对应的文件夹里即可

个人配置暂且如下:

{
"debugger":{
"i386": {
"x64dbg": "",
"gdb": "\"E:\\Program Files (x86)\\Dev-Cpp\\MinGW64\\bin\\gdb.exe\"",
"windbg": "E:\\Windows Kits\\10\\Debuggers\\x86\\windbg.exe"
},
"amd64": {
"x64dbg": "",
"gdb": "\"E:\\Program Files (x86)\\Dev-Cpp\\MinGW64\\bin\\gdb.exe\"",
"windbg": "E:\\Windows Kits\\10\\Debuggers\\x64\\windbg.exe"
}
},
"debugger_init": {
"i386": {
"x64dbg": "",
"gdb": "source E:\\CTF Tools\\Pwn\\peda-windows\\init.py",
"windbg": ".load pykd;!py -g winext\\TWindbg\\TWindbg.py;"
},
"amd64": {
"x64dbg": "",
"gdb": "source E:\\CTF Tools\\Pwn\\peda-windows\\init.py",
"windbg": ".load pykd;!py -g winext\\TWindbg\\TWindbg.py;"
}
}
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK