首页
社区
课程
招聘
[原创]SysWOW64的奇技淫巧
发表于: 2020-7-28 16:29 8473

[原创]SysWOW64的奇技淫巧

2020-7-28 16:29
8473

我感觉这玩意儿应该有人写过,但中文互联网怎么搜都搜不到,顺便看了看英文资料。发一个自己的实现好了

这玩意儿用处:

(1)反调试

(2)能让win10 32位程序运行64位代码(其他操作系统的wow64据说实现底层不太一样,不保证同代码能完全运行)


最近在试着转二进制漏洞方向,部署的时候出现了各种版本问题和反复崩溃,看到dynamoRIO下已经有成千的issue,想让开发者来debug肯定是不可能,于是只好自己上了。

在调试的过程中,发现dynamoRIO有一段ASM特别有意思

他是用来在32位程序中执行64位function的一段loader,摘抄见附录

关键的代码只有这么几行

通过一个长跳转,进入CS64_SELECTOR段选择子后,进入64位模式

我试了试摘出来写成汇编,效果非常好。

在OD里不仅分析不出64位的汇编,而且单步会直接跟飞。在windbg里只有单步才能分析出x64的代码

自己写的汇编如下




至于为什么这么改,外网有篇文章(https://www.malwaretech.com/2014/02/the-0x33-segment-selector-heavens-gate.html)写得特别好,我就不画蛇添足了,大概把大意翻译过来


首先,长跳转的机制是修改段寄存器CS来进行寻址和改变权限。段寄存器的结构分为selector、TL和RPL,selector代表段寄存器在GDT中对应的index,TL代表应该查局部表还是全局表(LDT/GDT),RPL是权限位。0x23和0x33的段寄存器如下。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 11
支持
分享
最新回复 (13)
雪    币: 14488
活跃值: (17468)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
mark,楼主辛苦了
2020-7-28 16:38
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
看这用处还不错,其实他们好像是可以互相跳的,毕竟指令都支持, 只是切下模式,改好运行环境即可
PS:还能有这么折腾的人不多了
2020-7-28 17:21
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
4
zhouws 看这用处还不错,其实他们好像是可以互相跳的,毕竟指令都支持, 只是切下模式,改好运行环境即可 PS:还能有这么折腾的人不多了[em_1]
我没试过在raw.x64下能不能切回来,我总感觉syswow64的做的初始化细节、重定位什么的这样直接bypass过去了还是有问题的

这年头除了病毒、壳和cm,几乎很少有反调试的场景了
2020-7-28 17:41
0
雪    币: 7232
活跃值: (2019)
能力值: ( LV4,RANK:42 )
在线值:
发帖
回帖
粉丝
5
大家可以参考 https://github.com/rwfpl/rewolf-wow64ext 这个库
2020-7-28 19:01
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
6
蜜蜂啊 大家可以参考 https://github.com/rwfpl/rewolf-wow64ext 这个库
谢谢大佬!!!
2020-7-28 23:29
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
7

借人气搭车求问一个非常诡异的问题……这个问题是dynamoRIO部署时AMD Ryzen特有的错误,就是和x86/x64切换有关
简而言之,在从x64切换回到x86时,dynamoRIO在执行主帖中附录的ASM程序遇到了个奇怪的错误——在程序的第61行pop ebx处出现了Access violation - code c0000005错误。而此时的ss和es值都是正常的。当程序单步调试时,一切正常,然而单独运行就会在这里崩溃


https://github.com/DynamoRIO/dynamorio/issues/4091
非常挠头,别怕又是什么处理器级别的BUG

最后于 2020-7-29 00:12 被NONAME剑人编辑 ,原因:
2020-7-29 00:08
0
雪    币: 1
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我写过一个工具可以使32bit程序链接64位的lib,最终形成一个32位与64位机器码混合的可执行文件。不过没有开源。
https://github.com/MoePus/wowHijack 这里则是另一个wow64特性的应用,32位程序可以使用WPM函数修改当前线程的eip。
2020-7-29 11:09
0
雪    币: 364
活跃值: (1706)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
标志,收藏
2020-7-29 11:40
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
10
songqy 我写过一个工具可以使32bit程序链接64位的lib,最终形成一个32位与64位机器码混合的可执行文件。不过没有开源。 https://github.com/MoePus/wowHijack 这里则 ...
感谢!!!!收藏了
2020-7-29 15:43
0
雪    币: 3126
活跃值: (3241)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
11
希望大佬再次归来能够多多分享,菜鸟mark了
2020-7-29 21:44
0
雪    币: 12304
活跃值: (5829)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
蜜蜂啊 大家可以参考 https://github.com/rwfpl/rewolf-wow64ext 这个库
这个库bug不少,尤其是调用某些参数是结构体地址并且要求地址内存对齐的,只能自己malloc一块对齐的内存存放,效率低下,而直接用汇编对齐rsp来存放兼容性又很差,不知道楼主有什么解决方案
2020-7-30 13:06
0
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
呵呵
2020-7-30 13:49
0
雪    币: 3176
活跃值: (1781)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
可以试试:利用CS切入,retf 返回,指令对齐可以利用预配置去设定,或者在跳转R15的时候,Hook掉,重新写执行流程(某个AV就是这么做的)。
2020-7-30 16:35
0
游客
登录 | 注册 方可回帖
返回
//