91免费
超级任天国游玩模拟器被曝坦然漏洞
发布日期:2021-09-30 18:13    点击次数:53

超级任天国(SNES,Super Nintendo Entertainment System)是任天国全球著名主机NES(国内称为幼霸王)的后续主机,主机采用16位色外现,令主机的画面外现在那时专门之棒。而行为那时的主机霸主,任天国SNES主机上展现了专门众经典的游玩,现在大红大紫的游玩系列许众都是在SNES上起身的。像勇者斗凶龙系列、传说系列、最后幻想系列、超时空之轮系列等等。以前的超级任天国倚赖全球数千万台的销量不息占有着游玩机市场的鳌头,在这个特出的平台上,诞生过众数特出的精品游玩,许众作品即使拿到现在与PS2,XBOX的游玩相比在游玩性方面也毫不失神(其实是比他们还要益许众)。倘若你对那些令人激动的游玩记忆犹新的话,而Snes9x能够在你的电脑上网模拟超级任天国,让你再次回到童年。柔件可按照分别硬件方便的调节声音,图象等。

上图中的谁人程序是一个 SNES 模拟器,很有游玩喜欢益者都行使过它。从网上找到这些东西并不难,但吾不会在文章里说,由于从技术上讲,这么做属于传播盗版。

最先,吾拿出旧的外部硬盘,找到了吾的SNES9x模拟器的压缩副本,启动它,就发现了一个 DLL 劫持漏洞。

Snes9x是款让你重温童年游玩的SNES模拟器,能够在Windows平台上运走经典SNES/SFC游玩的模拟器柔件,声援.smc, .sfc, .fig, 和 .1等格式的游玩,可用键盘,也能用手柄进走操作,声援键位修改。

以 x86 和 x64 架构编写的程序行使动态链接库 (DLL) 在柔件开发过程中挑供变通性和可移植性。 DLL 基本上是包含可重用代码、资源和变量的幼程序。就其性质而言,它们异国入口点并且必要父级可实走文件在运走时调用它们。倘若你只有一个 DLL,则能够行使 Rundll32.exe 之类的东西来运走该特定 DLL 的内容,而无需父级程序。否则,DLL 中的函数能够由父级可实走文件调用,行使 LoadLibrary API 调用将它们动态导入到程序中。

未必柔件开发并不十足按计划进走,并且你能够会频繁编写一个程序来调用添载一个不存在的 DLL。或者,在 SNES 模拟器的情况下,你能够会遇到相等于路径漏洞的题目,这基本上意味着程序尝试从现在做事现在录添载 DLL,然后在别处查找。

以下就是吾添载Procmon并运走SNES模拟器时的情况:

在上图中,SNES 模拟器已安放在吾的 FlareVM 主机的桌面上。当程序尝试添载opengl32.dll时,它最先检查现在做事现在录C:\Users\Husky\Desktop\SNES32bit\。当它在这边找不到指定的 DLL 时,它会转到SysWOW64现在录,并添载成功存在其中的DLL。这个SNES模拟器是一个32位行使程序,因此它检查SysWOW64是否必要dll是有意义的。

仔细,System32和SysWOW64有点像冰岛/格陵兰的情况。在标准的x64设备上,64位体系现在录是System32, 32位体系现在录是SysWOW64。

总之,这是一个漏洞。程序试图从一个能够写入的现在录中装入DLL。这是由于该程序已被复制到桌面,而不是装配在标准程序现在录中,例如“程引言件”。

这就很容易发生这个柔件被共享即从硬盘驱动器共享它,然后将文件复制到他们本身的笔记本电脑上。

另外,在这边必要仔细的是,SNES模拟器有DEP但异国ASLR,异日能够会回到谁人状态。

现在在一些抨击场景中,DLL劫持是经历以着手段实现的:只必要做一个MSFVenom DLL有效载荷,并将其替换为程序试图添载4head的载荷即可。直到程序休业或无法添载:

DOS不在这个周围内,要做得更益,能够进入DLL代理。

DLL 代理

DLL 代理实现 DLL 劫持的成功率更高。

你能够能够从 DLL 劫持中获得 shellcode 实走,但程序照样必要解析它想要从原首 DLL 进走的函数调用。而且你的 MSFVenom 生成的 DLL 不清新如那里理这些乞求的函数,因而calc.exe运走,程序休业。

在 DLL 代理中,你能够创建一个新的 DLL,其中包含指向原首 DLL 的导入函数的指针。有效载荷暗藏到这个DLL的一个片面中,并行使盈余的空间将可实走文件指向它想要添载的原首DLL。

该程序以其原首预期功能实走,得到有效载荷实走。

行使 Procmon,过滤以下内容:

掀开一个可实走文件或 10 并确定一个尝试添载到 DLL 中但异国成功的程序。在本文的示例中,吾凝神于 OpenGL32.dll:

重新配置过滤器,以查望该DLL是否在程序实走的任何时刻被成功添载。因此,只需过滤即可扩大你的搜索条件:

倘若你已经找到一个益的DLL代理候选,你能够会望到如下内容:

能够望到,将成功添载的 DLL 从主机复制到抨击者的设备上,并将其命名为 [dllName]_original.dll。幸运的是,这个DLL能够在所有Windows体系上都是本地的,因此你甚至能够不必要从现在的主机复制它,只需从你本身的 Windows 主机复制它即可。

在抨击者的设备上,行使这个浅易的Python脚本从原首DLL中掏出导出的函数并将它们写入一个模块定义文件 (.def):

请仔细引用原首DLL的两个位置,并确保响答地更改这些值。

在编译程序时,模块定义文件向编译器挑供相关链接导出的新闻。在本文示例中,吾们将通知编译器创建代理DLL,并将它链接到原首DLL,以指向它导出的所有函数。

因而,每当可实走文件问“嘿,DLL,函数在那里?”代理DLL便回复到:“哦,是的,往检查[dllName]_original.dll,它答该在那里。”

现在,吾们制作吾们的代理 DLL。这是一个用 C 编写的专门浅易的程序,它导出一个 DLLMain 函数行为 DLL 的入口点。在 DLLMain 手段中,吾们偷偷调用了 Payload 函数。该函数实走,然后所有其他乞求的函数调用都传递给 [dllName]_original.dll:

创建此 C 文件并将其命名为 [dllName].c:

到现在为止,一致顺当。

末了,吾们必要创建这个代理 DLL 并将它与吾们的模块定义文件链接首来。这能够经历 mingw-w64 来完善,它拥有编译DLL所需的必要工具链。仔细这边的架构:吾代理了32位SNES模拟器,因而吾必要为32位架构编译它。

倘若你的抨击设备上异国 mingw-w64,只需输入:

然后,编译吾们的 DLL:

当 DLL 编译时,你现在答该有四个文件能够行使:

[dllName]_original.dll:吾们从主机上拉下来的原首DLL,重命名为“_original” [dllName].c:包含吾们的有效载荷的代理 DLL 的 C 代码。 [dllName].def:行使Python脚本从原首dll中挑取导出的函数调用创建的模块定义文件。 [dllName].dll:新编译的代理DLL。

末了一步是将原首DLL和代理DLL在现在的主机的程序现在录下登陆,这两个 DLL 必须与彼此和原首程序位于联相符现在录中。

找到两个 DLL 后,启动程序!

此时,已经有了一个添载到代理DLL中的功能完善的程序。异国休业,异国段舛讹,只有calc。

本文翻译自:https://huskyhacks.dev/2021/08/29/dll-hijacking-dll-proxying-an-snes-emulator/

鸿蒙官方战略配相符共建——HarmonyOS技术社区