天堂之门——WoW64学习
天堂之门——WoW64学习
前述:
之前打比赛做题的时候遇到过天堂之门的题目,当时做完感觉云里雾里的,刚好前段时间遇到队友分享天堂之门,所以打算写篇博客来记录一下
具体的参考链接:天堂之门(WoW64技术)总结及CTF中的分析-CTF对抗-看雪-安全社区|安全招聘|kanxue.com
[原创]天堂之门-调试器的末路-软件逆向-看雪-安全社区|安全招聘|kanxue.com
天堂之门概念:
首先,我们需要了解什么是天堂之门。
其实天堂之门是指在计算机体系结构中实现从一种模式切换到另一种模式。例如,在早期的操作系统中,从实模式(real mode)切换到保护模式(protected mode),或者在某些嵌入式系统中从用户模式切换到内核模式。这种切换通常涉及到处理器状态的改变,例如段寄存器(Segment Registers)的修改等。
而现在我们涉及到的天堂之门往往指从32位模式到64位模式,比如32位的程序在64位操作系统上运行。
会被叫作天堂之门的原因可能是这种技术现了从一种模式切换到另外一种模式,比如从一个较低的位数模式(32位)到较高位数模式(64位)的跨越,仿佛是从一个较旧的环境进入到一个更为先进的环境,故称其为“天堂之门”。
然后接下来谈谈什么是WOW64。
WoW64概念:
WoW64是“Windows(32) on Windows 64”的简称,在《逆向工程核心原理》第36章中对于WOW64的定义是:一种在64位操作系统中支持与运行现有的32位应用程序的机制。
64位Windows中,32位应用程序与65位应用程序都可以正常运行。这是为什么呢?
我们需要了解其原理。
原理:
在64位Windows中,32位应用程序会加载kernel64.dll(64位)与ntdll.dll(64位),而32位程序则会加载kernel32.dll以及ntdll.dll(32位)。
而WoW64起到的作用则是在中间将ntdll.dll(32位)的请求(API调用)重定向到ntdll.dll(64位)。
对于重定向这一个板块,在《windows内核编程》的第五章中,也有涉及到对于在64位操作系统中运行32位程序的原理的提及。
64位跳转32位:
1 |
|
或者上面的指令的另一种实现方式
1 |
|
这段指令结合机器码看会方便很多
这个地方其实就是直接先把0x33压入栈中,然后执行call $5,将add指令的地址(刚好是当前的地址加5)放入栈中,然后这个时候执行add dword [esp], 5,刚好sp到retf下一条指令处,这个时候再执行retf,相当于pop 了retf下一条指令的值到sp,再pop 0x33的值到cs寄存器
然后继续正常执行下面的指令,这样就实现了从64位程序到执行64位程序的切换
32位跳转64位:
1 |
|
例题讲解:
例题1:ctfshow 月饼杯2 Easytea
题目下载地址:ctf.show
接着我们就直接从题目入手,打开main函数看到爆红,有点像花指令
直接看汇编
在0040124E处我们可以看到
1 |
|
我们需要了解一下jmp和jmp far的区别
jmp far会在jmp的基础上(修改ip的值),多一个修改cs的值的操作,修改的值就是在far后的数字,所以在上方的操作码中,在jmp一个地址(jmp 0x00401258)的基础上,将CS寄存器的寄存器的值修改为0x33
1 |
|
结合上面所提及到的32位跳转到64位的指令格式,所以这个地方就是跳转到0x401258处
可以找到下图中的位置
这个地方和上面我们讲到的从32位到64位是刚好符合的
在0x401255处我们可以看到call了[ebp+var_28]
然后往上翻可以看到[ebp+var_28]来自unk_427A50
所以我们选择在unk_427A50创建函数,得到
1 |
|
所以应该是把这些数据去创建一个64位的程序然后再进行反编译的
然后我们继续往下看,call后这个地方下来刚好是执行0x40126D处
我们在0x40126D创建函数
在这里dword_427A30处我们可以获取接下来需要解密的数据
所以我们选择自己随便写一个C的程序
然后通过
1 |
|
生成对应的64位程序
然后再在这个程序的data段使用Idapython进行将数据源给patch上去
1 |
|
最后复原出来的加密逻辑:
1 |
|
解密脚本:
1 |
|
最后获得flag
1 |
|