-
-
天堂之门(WoW64技术)总结及CTF中的分析
-
发表于: 2024-9-22 15:06 2807
-
天堂之门,是建立在WoW64技术上的逆向反调试技术
要去认识它,需要先明白64位系统中32位应用程序的执行过程以及WoW64是什么
在x64下的进程,不管是32位或者是64位,实际上都映射了两个地址空间,一个是32位,一个是64位,相当于一个进程的两种工作模式
解释:在64位的操作系统上,32位的应用程序并不能直接在64位环境下运行。为了使32位程序可以正常运行,操作系统提供了一个称为 WoW64(Windows on Windows 64-bit)的子系统。WoW64 子系统相当于一个兼容层,专门为32位程序提供了类似32位的运行环境
而这两种工作模式是可以进行切换的,他们之间的关键区别在于 cs
段寄存器
Windows判别位的方式,是根据cs
段寄存器的,所以只要修改cs
的值,就能实现切换,再使用retf
指令回到xx位
WoW64(Windows-on-Windows 64-bit)是微软Windows操作系统的一个子系统,它使得32位应用程序能够在64位Windows操作系统上运行。WoW64实现了对32位应用程序的透明兼容,主要通过以下方式:
32位程序首先调用32位ntdll.dll
中的32位函数
再由ntdll.dll
调用wow64cpu.dll
中的X86SwitchTo64BitMode
,就是调用该函数后进程从32位模式切换到64位模式,wow64.dll
将32位的系统调用转化为64位
再调用64位ntdll.dll
中的64位函数
ps:retf
是切换32位和64位的关键指令
关于WoW64的知识,在《逆向工程核心原理》的第36章有介绍,上述是本书提供的样例代码,在x86和x32的源码相同
发现32位程序的运行结果与64位程序结果不同
64位程序返回的是正确的值,而32位程序虽然识别的是C:\WINDOWS\system32\
,但是实际指向内容却是转为32位程序准备的SysWOW64
。这是WOW64对32位程序进行重定向的结果
题目:ctfshow上的月饼杯2 EasyTea
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位函数
由于是静态,便可以将这个unk_427A50
dump出来,patch到随意的64位程序中
打开test.exe(任意64位程序),这里我在.data区的0x1400060C0位置上开始patch
IDApython:
然后P创建函数
得到了很清晰的魔改XTEA逻辑
本题的思路:
遇到32位程序调用64位函数的天堂之门,解题思路:根据汇编和机器码找到64位函数,dump到64位程序中阅读
参考文章中提到还可能出现动态天堂之门,只有动调手撕了。。。
可能有某些地方理解的不是很到位,若有问题,敬请指教!
天堂之门技术,除了CTF中的反调应用,实战中应该只会存在于恶意程序
因为看大佬们沙箱&火绒剑测试的结果,都会被识别出来,实战用处不大
若还想看看其他CTF题中的应用,可以参考此大佬的文章:CTF中32位程序调用64位代码的逆向方法-安全客 - 安全资讯平台 (anquanke.com)
天堂之门 - TLSN - 博客园 (cnblogs.com)
[原创]天堂之门-调试器的末路-软件逆向-看雪-安全社区|安全招聘|kanxue.com
[原创]天堂之门 (Heaven's Gate) C语言实现-软件逆向-看雪-安全社区|安全招聘|kanxue.com
天堂之门(Heaven's Gate)逆向 - yuhury - 博客园 (cnblogs.com)
天堂之门技术 | Taardis's blog (taardisaa.github.io)
[分享][原创]汇编里看Wow64的原理(浅谈32位程序是怎样在windows 64上运行的?)-软件逆向-看雪-安全社区|安全招聘|kanxue.com
WoW Hell: Rebuilding Heavens Gate - HITBSecConf2021 - Amsterdam HITBSecConf2021 – Amsterdam
#include "stdio.h"
#include "windows.h"
#include "Shlobj.h"
#include "tchar.h"
#pragma comment(lib, "Shell32.lib")
int
_tmain(
int
argc,
TCHAR
* argv[])
{
HKEY
hKey = NULL;
HANDLE
hFile = INVALID_HANDLE_VALUE;
TCHAR
szPath[MAX_PATH] = { 0, };
////////////////
// system32 folder
if
(GetSystemDirectory(szPath, MAX_PATH))
{
_tprintf(L
"1) system32 path = %s\n"
, szPath);
}
////////////////
// File size
_tcscat_s(szPath, L
"\\kernel32.dll"
);
hFile = CreateFile(szPath, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if
(hFile != INVALID_HANDLE_VALUE)
{
_tprintf(L
"2) File size of \"%s\" = %d\n"
,
szPath, GetFileSize(hFile, NULL));
CloseHandle(hFile);
}
////////////////
// Program Files
if
(SHGetSpecialFolderPath(NULL, szPath,
CSIDL_PROGRAM_FILES, FALSE))
{
_tprintf(L
"3) Program Files path = %s\n"
, szPath);
}
////////////////
// Registry
if
(ERROR_SUCCESS == RegCreateKey(HKEY_LOCAL_MACHINE,
L
"SOFTWARE\\ReverseCore"
, &hKey))
{
RegCloseKey(hKey);
_tprintf(L
"4) Create Registry Key : HKLM\\SOFTWARE\\ReverseCore\n"
);
}
return
0;
}
#include "stdio.h"
#include "windows.h"
#include "Shlobj.h"
#include "tchar.h"
#pragma comment(lib, "Shell32.lib")
int
_tmain(
int
argc,
TCHAR
* argv[])
{
HKEY
hKey = NULL;
HANDLE
hFile = INVALID_HANDLE_VALUE;
TCHAR
szPath[MAX_PATH] = { 0, };
////////////////
// system32 folder
if
(GetSystemDirectory(szPath, MAX_PATH))
{
_tprintf(L
"1) system32 path = %s\n"
, szPath);
}
////////////////
// File size
_tcscat_s(szPath, L
"\\kernel32.dll"
);
hFile = CreateFile(szPath, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if
(hFile != INVALID_HANDLE_VALUE)
{
_tprintf(L
"2) File size of \"%s\" = %d\n"
,
szPath, GetFileSize(hFile, NULL));
CloseHandle(hFile);
}
////////////////
// Program Files
if
(SHGetSpecialFolderPath(NULL, szPath,
CSIDL_PROGRAM_FILES, FALSE))
{
_tprintf(L
"3) Program Files path = %s\n"
, szPath);
}
////////////////
// Registry
if
(ERROR_SUCCESS == RegCreateKey(HKEY_LOCAL_MACHINE,
L
"SOFTWARE\\ReverseCore"
, &hKey))
{
RegCloseKey(hKey);
_tprintf(L
"4) Create Registry Key : HKLM\\SOFTWARE\\ReverseCore\n"
);
}
return
0;
}
unsigned
int
dword_427A30[8] = {
0xB5ABA743, 0x4C5B3EE0, 0xB70AEB14, 0x6946BC13, 0x906089C4, 0x5B9F98F0, 0x0964B652, 0x78920976
};
unsigned
int
dword_427A30[8] = {
0xB5ABA743, 0x4C5B3EE0, 0xB70AEB14, 0x6946BC13, 0x906089C4, 0x5B9F98F0, 0x0964B652, 0x78920976
};
# include<stdio.h>
int
main()
{
printf
(
"Hello world!\n"
);
return
0;
}
// 现写一个hello world代码
// gcc version 13.2.0 (GCC)
// gcc -o test test.c编译为64位程序
# include<stdio.h>
int
main()
{
printf
(
"Hello world!\n"
);
return
0;
}
// 现写一个hello world代码
// gcc version 13.2.0 (GCC)
// gcc -o test test.c编译为64位程序
dump_data
=
[
0x48
,
0x89
,
0x4C
,
0x24
,
0x08
,
0x55
,
0x57
,
0x48
,
0x81
,
0xEC
,
0xA8
,
0x01
,
0x00
,
0x00
,
0x48
,
0x8D
,
0x6C
,
0x24
,
0x20
,
0x48
,
0x8B
,
0xFC
,
0xB9
,
0x6A
,
0x00
,
0x00
,
0x00
,
0xB8
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xF3
,
0xAB
,
0x48
,
0x8B
,
0x8C
,
0x24
,
0xC8
,
0x01
,
0x00
,
0x00
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0xC7
,
0x45
,
0x08
,
0x66
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x0C
,
0x6C
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x10
,
0x61
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x14
,
0x67
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x18
,
0x69
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x1C
,
0x73
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x20
,
0x6D
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x24
,
0x65
,
0x00
,
0x00
,
0x00
,
0xB8
,
0x04
,
0x00
,
0x00
,
0x00
,
0x48
,
0x6B
,
0xC0
,
0x07
,
0x48
,
0x8B
,
0x8D
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x8B
,
0x04
,
0x01
,
0x89
,
0x45
,
0x44
,
0xC7
,
0x45
,
0x64
,
0x00
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x85
,
0x84
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0xEB
,
0x0E
,
0x8B
,
0x85
,
0x84
,
0x00
,
0x00
,
0x00
,
0xFF
,
0xC0
,
0x89
,
0x85
,
0x84
,
0x00
,
0x00
,
0x00
,
0x83
,
0xBD
,
0x84
,
0x00
,
0x00
,
0x00
,
0x20
,
0x0F
,
0x8D
,
0x44
,
0x01
,
0x00
,
0x00
,
0x8B
,
0x45
,
0x64
,
0x05
,
0x45
,
0x11
,
0x48
,
0x88
,
0x89
,
0x45
,
0x64
,
0xC7
,
0x85
,
0xA4
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0xEB
,
0x0E
,
0x8B
,
0x85
,
0xA4
,
0x00
,
0x00
,
0x00
,
0xFF
,
0xC0
,
0x89
,
0x85
,
0xA4
,
0x00
,
0x00
,
0x00
,
0x83
,
0xBD
,
0xA4
,
0x00
,
0x00
,
0x00
,
0x07
,
0x0F
,
0x8D
,
0x8A
,
0x00
,
0x00
,
0x00
,
0x48
,
0x63
,
0x85
,
0xA4
,
0x00
,
0x00
,
0x00
,
0x8B
,
0x8D
,
0xA4
,
0x00
,
0x00
,
0x00
,
0xFF
,
0xC1
,
0x48
,
0x63
,
0xC9
,
0x48
,
0x8B
,
0x95
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x8B
,
0x0C
,
0x8A
,
0xC1
,
0xE1
,
0x04
,
0x8B
,
0x95
,
0xA4
,
0x00
,
0x00
,
0x00
,
0xFF
,
0xC2
,
0x48
,
0x63
,
0xD2
,
0x4C
,
0x8B
,
0x85
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x41
,
0x8B
,
0x14
,
0x90
,
0xC1
,
0xFA
,
0x05
,
0x33
,
0xCA
,
0x8B
,
0x95
,
0xA4
,
0x00
,
0x00
,
0x00
,
0xFF
,
0xC2
,
0x48
,
0x63
,
0xD2
,
0x4C
,
0x8B
,
0x85
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x41
,
0x03
,
0x0C
,
0x90
,
0x8B
,
0x55
,
0x64
,
0x83
,
0xE2
,
0x07
,
0x8B
,
0xD2
,
0x8B
,
0x54
,
0x95
,
0x08
,
0x44
,
0x8B
,
0x45
,
0x64
,
0x44
,
0x03
,
0xC2
,
0x41
,
0x8B
,
0xD0
,
0x33
,
0xCA
,
0x48
,
0x8B
,
0x95
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x03
,
0x0C
,
0x82
,
0x8B
,
0xC1
,
0x48
,
0x63
,
0x8D
,
0xA4
,
0x00
,
0x00
,
0x00
,
0x48
,
0x8B
,
0x95
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x89
,
0x04
,
0x8A
,
0xE9
,
0x5B
,
0xFF
,
0xFF
,
0xFF
,
0xB8
,
0x04
,
0x00
,
0x00
,
0x00
,
0x48
,
0x6B
,
0xC0
,
0x07
,
0xB9
,
0x04
,
0x00
,
0x00
,
0x00
,
0x48
,
0x6B
,
0xC9
,
0x00
,
0x48
,
0x8B
,
0x95
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x8B
,
0x0C
,
0x0A
,
0xC1
,
0xE1
,
0x04
,
0xBA
,
0x04
,
0x00
,
0x00
,
0x00
,
0x48
,
0x6B
,
0xD2
,
0x00
,
0x4C
,
0x8B
,
0x85
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x41
,
0x8B
,
0x14
,
0x10
,
0xC1
,
0xFA
,
0x05
,
0x33
,
0xCA
,
0xBA
,
0x04
,
0x00
,
0x00
,
0x00
,
0x48
,
0x6B
,
0xD2
,
0x00
,
0x4C
,
0x8B
,
0x85
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x41
,
0x03
,
0x0C
,
0x10
,
0x8B
,
0x55
,
0x64
,
0x83
,
0xE2
,
0x07
,
0x8B
,
0xD2
,
0x8B
,
0x54
,
0x95
,
0x08
,
0x44
,
0x8B
,
0x45
,
0x64
,
0x44
,
0x03
,
0xC2
,
0x41
,
0x8B
,
0xD0
,
0x33
,
0xCA
,
0x48
,
0x8B
,
0x95
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x03
,
0x0C
,
0x02
,
0x8B
,
0xC1
,
0xB9
,
0x04
,
0x00
,
0x00
,
0x00
,
0x48
,
0x6B
,
0xC9
,
0x07
,
0x48
,
0x8B
,
0x95
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x89
,
0x04
,
0x0A
,
0xE9
,
0xA1
,
0xFE
,
0xFF
,
0xFF
,
0x48
,
0x8D
,
0x4D
,
0xE0
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x48
,
0x8D
,
0xA5
,
0x88
,
0x01
,
0x00
,
0x00
,
0x5F
,
0x5D
,
0xC3
]
start_addr
=
0x1400060C0
end_addr
=
start_addr
+
len
(dump_data)
for
i
in
range
(start_addr, end_addr):
idc.patch_byte(i, dump_data[i
-
start_addr])
dump_data
=
[
0x48
,
0x89
,
0x4C
,
0x24
,
0x08
,
0x55
,
0x57
,
0x48
,
0x81
,
0xEC
,
0xA8
,
0x01
,
0x00
,
0x00
,
0x48
,
0x8D
,
0x6C
,
0x24
,
0x20
,
0x48
,
0x8B
,
0xFC
,
0xB9
,
0x6A
,
0x00
,
0x00
,
0x00
,
0xB8
,
0xCC
,
0xCC
,
0xCC
,
0xCC
,
0xF3
,
0xAB
,
0x48
,
0x8B
,
0x8C
,
0x24
,
0xC8
,
0x01
,
0x00
,
0x00
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0x90
,
0xC7
,
0x45
,
0x08
,
0x66
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x0C
,
0x6C
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x10
,
0x61
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x14
,
0x67
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x18
,
0x69
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x1C
,
0x73
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x20
,
0x6D
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x45
,
0x24
,
0x65
,
0x00
,
0x00
,
0x00
,
0xB8
,
0x04
,
0x00
,
0x00
,
0x00
,
0x48
,
0x6B
,
0xC0
,
0x07
,
0x48
,
0x8B
,
0x8D
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x8B
,
0x04
,
0x01
,
0x89
,
0x45
,
0x44
,
0xC7
,
0x45
,
0x64
,
0x00
,
0x00
,
0x00
,
0x00
,
0xC7
,
0x85
,
0x84
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0xEB
,
0x0E
,
0x8B
,
0x85
,
0x84
,
0x00
,
0x00
,
0x00
,
0xFF
,
0xC0
,
0x89
,
0x85
,
0x84
,
0x00
,
0x00
,
0x00
,
0x83
,
0xBD
,
0x84
,
0x00
,
0x00
,
0x00
,
0x20
,
0x0F
,
0x8D
,
0x44
,
0x01
,
0x00
,
0x00
,
0x8B
,
0x45
,
0x64
,
0x05
,
0x45
,
0x11
,
0x48
,
0x88
,
0x89
,
0x45
,
0x64
,
0xC7
,
0x85
,
0xA4
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0xEB
,
0x0E
,
0x8B
,
0x85
,
0xA4
,
0x00
,
0x00
,
0x00
,
0xFF
,
0xC0
,
0x89
,
0x85
,
0xA4
,
0x00
,
0x00
,
0x00
,
0x83
,
0xBD
,
0xA4
,
0x00
,
0x00
,
0x00
,
0x07
,
0x0F
,
0x8D
,
0x8A
,
0x00
,
0x00
,
0x00
,
0x48
,
0x63
,
0x85
,
0xA4
,
0x00
,
0x00
,
0x00
,
0x8B
,
0x8D
,
0xA4
,
0x00
,
0x00
,
0x00
,
0xFF
,
0xC1
,
0x48
,
0x63
,
0xC9
,
0x48
,
0x8B
,
0x95
,
0xA0
,
0x01
,
0x00
,
0x00
,
0x8B
,
0x0C
,
0x8A
,
0xC1
,
0xE1
,
0x04
,
0x8B
,
赞赏
- 天堂之门(WoW64技术)总结及CTF中的分析 2808
- [原创]2024长城杯初赛RE(部分题目) 2372
- [原创]Data lab 1762