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

[原创]SysWOW64的奇技淫巧

2020-7-28 16:29
8867

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

这玩意儿用处:

(1)反调试

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


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

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

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

关键的代码只有这么几行

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

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

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

自己写的汇编如下




至于为什么这么改,外网有篇文章(2ccK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2E0j5h3I4%4j5i4u0W2N6r3g2U0K9q4)9J5k6h3y4G2L8g2)9J5c8U0t1H3x3e0c8Q4x3V1j5H3x3W2)9J5c8Y4c8Z5k6g2)9J5k6o6m8^5x3K6y4Q4x3X3c8K6k6h3N6E0k6h3&6@1i4K6u0V1M7$3g2D9k6h3y4@1L8%4u0Q4x3X3c8Z5k6h3q4$3k6h3&6K6i4K6u0V1k6$3q4@1k6g2)9J5k6h3S2@1L8h3I4Q4c8f1k6Q4b7V1y4Q4z5o6W2Q4c8e0g2Q4z5o6k6Q4z5e0W2Q4c8e0g2Q4b7V1g2Q4z5e0N6Q4c8e0N6Q4z5o6W2Q4b7U0W2Q4c8e0g2Q4z5o6S2Q4b7f1u0Q4c8e0g2Q4b7e0g2Q4b7V1c8Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0k6Q4z5o6S2Q4z5e0q4Q4c8e0g2Q4b7U0m8Q4b7U0q4Q4c8e0c8Q4b7U0S2Q4z5p5c8Q4c8e0N6Q4z5e0c8Q4b7V1u0Q4c8e0S2Q4z5f1u0Q4z5o6N6Q4c8e0k6Q4b7U0N6Q4b7V1u0Q4c8e0S2Q4b7U0k6Q4b7U0y4Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4b7e0c8Q4b7e0N6Q4c8e0k6Q4b7e0k6Q4z5o6u0Q4c8e0k6Q4z5p5q4Q4z5p5q4Q4c8e0g2Q4b7e0c8Q4b7e0N6Q4c8e0k6Q4z5o6c8Q4z5p5k6Q4c8e0N6Q4b7V1k6Q4b7V1u0Q4c8e0S2Q4b7f1k6Q4z5e0q4Q4c8e0S2Q4b7V1k6Q4z5o6N6Q4c8e0k6Q4z5f1c8Q4b7e0f1`.


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


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

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

这年头除了病毒、壳和cm,几乎很少有反调试的场景了
2020-7-28 17:41
0
雪    币: 5691
活跃值: (2437)
能力值: ( LV4,RANK:42 )
在线值:
发帖
回帖
粉丝
5
大家可以参考 4dcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6J5N6$3k6H3L8q4)9J5c8Y4u0W2N6$3!0D9k6W2)9J5k6s2N6G2N6K6j5@1k6i4S2@1i4K6t1$3L8X3u0K6M7q4)9K6b7W2!0q4z5q4!0n7c8W2)9&6z5g2!0q4y4q4!0n7z5q4!0m8b7g2!0q4y4g2!0n7b7g2)9&6x3H3`.`.
2020-7-28 19:01
0
雪    币: 740
活跃值: (957)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
6
蜜蜂啊 大家可以参考 970K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6J5N6$3k6H3L8q4)9J5c8Y4u0W2N6$3!0D9k6W2)9J5k6s2N6G2N6K6j5@1k6i4S2@1 这个库
谢谢大佬!!!
2020-7-28 23:29
0
雪    币: 740
活跃值: (957)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
7

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


7adK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6p5P5h3&6S2L8h3!0d9d9f1!0Q4x3V1k6V1P5h3&6S2L8h3!0J5K9h3!0Q4x3V1k6A6M7%4y4#2k6i4y4Q4x3V1j5@1x3o6V1I4
非常挠头,别怕又是什么处理器级别的BUG

最后于 2020-7-29 00:12 被NONAME剑人编辑 ,原因:
2020-7-29 00:08
0
雪    币: 1
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我写过一个工具可以使32bit程序链接64位的lib,最终形成一个32位与64位机器码混合的可执行文件。不过没有开源。
342K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6y4L8$3g2b7N6i4y4Q4x3V1k6%4L8%4N6t1K9h3A6S2j5$3E0Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4@1f1^5i4@1u0r3i4K6V1&6i4@1f1&6i4K6R3%4i4K6S2o6i4@1f1#2i4K6R3^5i4K6V1&6i4@1f1$3i4K6V1^5i4@1q4r3i4@1f1#2i4K6S2r3i4@1p5$3i4@1f1@1i4@1t1^5i4K6R3H3i4@1f1@1i4@1t1^5i4@1q4m8N6$3!0%4y4U0c8Q4c8e0N6Q4z5o6W2Q4b7U0W2Q4c8e0k6Q4z5o6m8Q4b7e0N6Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0g2Q4b7V1q4Q4z5e0c8Q4c8e0N6Q4z5e0c8Q4b7e0S2Q4c8f1k6Q4b7V1y4Q4z5p5x3K6x3W2!0q4y4q4!0n7c8q4)9^5c8q4!0q4y4#2!0m8z5q4)9^5b7W2!0q4y4g2!0n7b7g2)9^5c8W2!0q4y4g2)9^5c8W2!0m8c8W2!0q4y4q4!0n7b7W2!0m8y4g2!0q4y4q4!0n7c8q4!0n7c8W2!0q4y4#2)9&6y4q4!0m8z5q4N6b7e0g2!0q4y4g2)9^5y4#2!0n7c8q4!0q4y4W2)9&6y4g2!0n7x3q4!0q4y4q4!0n7c8W2!0m8c8g2!0q4y4W2)9&6y4q4!0n7z5g2!0q4y4g2!0n7c8q4)9&6x3#2!0q4y4g2)9^5z5g2)9^5c8q4!0q4y4#2!0n7b7g2!0n7c8W2!0q4y4#2!0m8z5q4)9^5b7W2!0q4y4#2)9&6b7g2)9^5y4r3g2A6M7q4!0q4x3#2)9^5x3q4)9^5x3R3`.`.
2020-7-29 11:09
0
雪    币: 364
活跃值: (2157)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
标志,收藏
2020-7-29 11:40
0
雪    币: 740
活跃值: (957)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
10
songqy 我写过一个工具可以使32bit程序链接64位的lib,最终形成一个32位与64位机器码混合的可执行文件。不过没有开源。 10dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6y4L8$3g2b7N6i4y4Q4x3V1k6%4L8%4N6t1K9h3A6S2j5$3D9`. 这里则 ...
感谢!!!!收藏了
2020-7-29 15:43
0
雪    币: 3126
活跃值: (3871)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
11
希望大佬再次归来能够多多分享,菜鸟mark了
2020-7-29 21:44
0
雪    币: 13493
活跃值: (6909)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
蜜蜂啊 大家可以参考 9faK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6J5N6$3k6H3L8q4)9J5c8Y4u0W2N6$3!0D9k6W2)9J5k6s2N6G2N6K6j5@1k6i4S2@1 这个库
这个库bug不少,尤其是调用某些参数是结构体地址并且要求地址内存对齐的,只能自己malloc一块对齐的内存存放,效率低下,而直接用汇编对齐rsp来存放兼容性又很差,不知道楼主有什么解决方案
2020-7-30 13:06
0
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
呵呵
2020-7-30 13:49
0
雪    币: 3407
活跃值: (2406)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
可以试试:利用CS切入,retf 返回,指令对齐可以利用预配置去设定,或者在跳转R15的时候,Hook掉,重新写执行流程(某个AV就是这么做的)。
2020-7-30 16:35
0
游客
登录 | 注册 方可回帖
返回