type
status
date
slug
summary
tags
category
icon
password
天堂之门(Heaven's Gate)
一、基础知识
天堂之门,是建立在WoW64技术上的逆向反调试技术
要去认识它,需要先明白64位系统中32位应用程序的执行过程以及WoW64是什么
1.1 在x64下的进程
在x64下的进程,不管是32位或者是64位,实际上都映射了两个地址空间,一个是32位,一个是64位,相当于一个进程的两种工作模式
解释:在64位的操作系统上,32位的应用程序并不能直接在64位环境下运行。为了使32位程序可以正常运行,操作系统提供了一个称为 WoW64(Windows on Windows 64-bit)的子系统。WoW64 子系统相当于一个兼容层,专门为32位程序提供了类似32位的运行环境
- 事实上这个32位程序运行的环境也是一个64位的运行环境,系统在创建32位进程时,首先创建一个64位的进程,然后再在其中创建一个32位的子环境。32位程序所调用的系统函数,最终都要通过64位的动态链接库而实现
而这两种工作模式是可以进行切换的,他们之间的关键区别在于
cs
段寄存器- 64位:CS = 0x33
- 32位:CS = 0x23
Windows判别位的方式,是根据
cs
段寄存器的,所以只要修改cs
的值,就能实现切换,再使用retf
指令回到xx位1.2 WoW64
WoW64(Windows-on-Windows 64-bit)是微软Windows操作系统的一个子系统,它使得32位应用程序能够在64位Windows操作系统上运行。WoW64实现了对32位应用程序的透明兼容,主要通过以下方式:
- 系统调用转化:32位系统调用转换为64位系统调用。
- 地址空间隔离:32位进程和64位进程拥有各自的虚拟地址空间。
- 库文件分离:WoW64将32位和64位的库文件分别存储在不同的系统目录中
- 在32位程序中,使用
syscall
orcall
以及jmp far ptr
orcall far ptr
实现跨位运行
- ps:在windows下调试时windbg对32/64位切换的支持较好,其他如ida、x32dbg等调试器在retf语句后都无法调试
二、WoW64实现过程
32位程序首先调用32位
ntdll.dll
中的32位函数再由
ntdll.dll
调用wow64cpu.dll
中的X86SwitchTo64BitMode
,就是调用该函数后进程从32位模式切换到64位模式,wow64.dll
将32位的系统调用转化为64位再调用64位
ntdll.dll
中的64位函数2.1 转换过程参考
ps:
retf
是切换32位和64位的关键指令2.2 Test
关于WoW64的知识,在《逆向工程核心原理》的第36章有介绍,上述是本书提供的样例代码,在x86和x32的源码相同
- x86运行
- x64运行
发现32位程序的运行结果与64位程序结果不同
64位程序返回的是正确的值,而32位程序虽然识别的是
C:\WINDOWS\system32\
,但是实际指向内容却是转为32位程序准备的SysWOW64
。这是WOW64对32位程序进行重定向的结果三、CTF运用
题目:ctfshow上的
月饼杯2 EasyTea
3.1 分析天堂之门部分
0xEA是jmp far ptr的操作吗,会跳转到指定段和偏移地址。
58 12 40 00 是指偏移地址0x00401258
段选择符为 33 00 将cs寄存器改为0x33
即后面将执行的是64位指令
此处是将eip改为0x40126D,cs改为0x23
跳转至0x40126D处,先U再P
这里是最终逻辑,是一个cmp函数,提取出cipher
然后继续回找,现在主要看00401258处call指令指向的地址是哪
双击过去是.data段的数据流
强行P创建函数
发现都是64位的指令,32位IDA反编译的结果并不好分析
至此本题完成了32位程序使用64位函数
3.2 解题
由于是静态,便可以将这个
unk_427A50
dump出来,patch到随意的64位程序中打开test.exe(任意64位程序),这里我在.data区的0x1400060C0位置上开始patch
idapython:
然后P创建函数
得到了很清晰的魔改XTEA逻辑
3.3 EXP
3.4 总结
本题的思路:
遇到32位程序调用64位函数的天堂之门,解题思路:根据汇编和机器码找到64位函数,dump到64位程序中阅读
参考文章中提到还可能出现动态天堂之门,只有动调手撕了。。。
四、杂谈
天堂之门技术,除了CTF中的反调应用,实战中应该只会存在于
恶意程序
因为看大佬们沙箱&火绒剑测试的结果,都会被识别出来,实战用处不大
若还想看看其他CTF题中的应用,可以参考此大佬的文章:CTF中32位程序调用64位代码的逆向方法-安全客 - 安全资讯平台 (anquanke.com)
- 参考文章:
- 作者:Sh4d0w
- 链接:https://sh4d0w.life//article/10d50fad-5ffd-80ee-9f2c-e9a32d2a4ed9
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。