迈克尔:我欢迎大家,我是赖昌星,这是马修·理查德,您可以称他为马特或理查德,因为他有两个名字,但这并不重要。
马特:今天我们谈话的主题是嘲笑恶意软件,而这正是我们正在尝试做的事情。

因此,并非每个编写代码的人都做得很好,人们会犯很多错误。 并非所有人都使用这种病毒。 在这两种情况下也都有失败的人。 因此,请更加舒适地坐下来,放松并倾听,也许这些信息对您有用。
为了以防万一,我们在演示中包括了一些实际的技术资料,以便您至少可以从对话中觉得不愉快的地方学到一些东西。 我注意到这只是我们的观点,可能与雇主的观点不一致。
迈克尔:第一个故事叫“亲爱的,我降低了熵!” 她谈到了非常复杂的加密算法Silent Banker的作者如何忘记使用伪随机数生成器PRNG来创建熵。 在幻灯片上,您会看到2007年9月的宙斯代码段,其中PRNG用于防止基于散列的检测。 生成包括启动一个名为ddTickCount的全局变量:首先,它将其放置在EAX寄存器中,从该寄存器中首次调用该函数。 然后检查该函数的值是否等于零,如果不等于零,则使用GetTickCount命令调用TickCount生成SEED,即启动伪随机数。

当我们从2008年2月开始在Silent Banker二进制文件中看到与此代码的相似之处时,我们并不感到惊讶。 它使用PRNG生成临时文件名。 这里也有相同的全局变量ddTickCount,它检查是否存在零,如果存在,则使用GetTickCount初始化伪随机数。 首先,在我看到msvsrt rand(Microsoft C运行时Windows库的rand()函数使用的伪随机数生成器)之前,我认为Zeus作者和Silent Banker作者之间存在联系,仅基于已硬编码为二进制文件的HEX数字。 但实际上,它们都只是静态链接到msvsrt。
现在我们来了解灾难的秘诀。 这是Silent Banker 2008年7月版的代码片段,该版本在2月版之后的几个月发布。

他们更新了代码并发布了Silent Banker的新版本,该版本与我们之前看到的版本有很大不同。 在此程序中,PRNG用于生成加密密钥。 在这里,您不再看到检查名为CurrentSeed的全局变量是否等于零,并且根据此变量生成了伪随机数,在此代码中仅使用了该变量。

可能在二进制文件中的某个位置,甚至在此位置之前,以某种数字类型的形式生成此全局变量的值。 因此,我继续反汇编此代码,看看在此rand()函数中使用CurrentSeed值之前,是否在程序中的其他位置使用它。 您会看到dd最初是从头开始的,我们将检查对该变量的交叉引用。

在T列中,值w表示整个二进制文件中对该全局变量只有一个有效的操作-这是rand函数本身。 我会流利地处理这些事情,因为去年的DefCon中已经提到了它们。 在“灾难配方”幻灯片上,灰色种子行PRNG或“启动伪随机数生成器”显示为灰色,表明Silent Banker的作者未进行此初始化。

下一步是它们生成一个16字节的密钥,对MyRand()函数进行1000次系统调用。 然后,它们使用一个特定的公式从一个16字节的密钥生成一个8字节的数字-密钥。
之后,它们会生成另一个8字节数字,以从第一个8字节数字创建辅助密钥,然后从INI配置文件中为其添加一个任意值,并获得一个第三密钥,该密钥也是8字节数字。 最后,他们使用任意精度的数学函数将8字节的密钥转换为32字节的密钥。
之后,他们使用原始的16字节密钥对诸如用户密码之类的被盗数据进行加密。 但是他们不会将这个“ 16”字节数字与窃取的数据传递给“他们的”攻击者,因为将密钥与加密的消息一起发送并不是一个好主意。 取而代之的是,Silent Banker的作者将一个32字节的数字放入所窃取的数据中,然后将其发送给接收者,该接收者应具有一个将该数字转换回16字节原始密钥的程序。 但是,我们没有此程序!
下一张幻灯片显示了如何利用第1条灾难的方法-缺少PRNG发生器-使您受益。

首先,我们将PRNG的值等于零。 我们可以使用调试器的Python脚本来自动化接下来的四个步骤,因为我们有一个公式来计算16字节密钥,8字节密钥,接下来的8字节密钥和32字节密钥。 这个公式不在C代码中,但是我们有它,因为我们有一个Silent Banker二进制文件的副本。
我将向您展示此Python脚本如何工作的演示。 我们有一个很好的方案:这里有Silent Banker和我连接的独立调试器,以及运行Silent Banker的Internet Explorer。 我注意到了生成加密密钥的四个功能。 我包括上一张幻灯片中显示的Python脚本,我用bang keygen命令调用了它。 您会看到调试器只是“丢失”了我要为此演示执行的5次功能。 但是在现实生活中,我们执行了5,000次此操作以获取更大的键集。
在日志面板上,您可以看到对于循环的每次迭代,将输出一个主16字节密钥,然后将其与32字节密钥关联。 在脚本打印日志中的信息的同时,还会在磁盘上创建一个文本文件,其中包括成对的16和32字节相关密钥。 它只是一个十六进制的HEX文件,因此我们可以使用Python脚本来处理该文件,我们还有一个日志目录,该目录是从被盗的命令和控制节点中恢复的。

在顶部,您会看到几个加密的私钥证书,在它们的下面是几个包含加密数据的文本文件。 我们可以简单地运行该程序,并通过提取此32字节密钥和与其关联的16字节原始密钥在这些文本文件中进行搜索。
程序一旦找到一个16字节的密钥,就会解密其中包含的信息,并以文本文件的形式显示。 您在屏幕上看到该文件,并且无法读取。

但是,我们有了一堆可读的.tmp临时文件,从那里我们可以获取此信息并将其返回给“合法”所有者。 因此,保护信息的所有艰苦工作都是由Silent Banker徒劳地完成的,因为他们忘记了启动伪随机数生成器。

现在,我将展示上面的最佳部分-这是Silent Banker函数,我将其称为Why_Not_Use_This(为什么不使用它?)。

实际上,在他们自己的程序中,他们具有用于生成熵的GetCursorPos函数(确定光标位置),该函数可用于启动PRNG,并且我们可以在程序内部检查对此函数的交叉引用。

我们看到它在代码中的其他10-15个地方使用。 因此,事实证明,Silent Banker的作者并没有忘记在程序中插入一个伪随机数生成器,他们只是简单地忘记了在使用调用运算符的加密过程中运行此功能。

下一张幻灯片称为“那溜走了……”,它显示了如果作者没有忘记任何内容,该程序将如何工作。

接下来的标题是“ DES或不是DES”,是关于一个恶意软件作者的,他甚至不知道如何正确使用Windows编程界面,或者不知道最大DES密钥大小。 结果,由于此密钥的大小无效,默认情况下,其木马与逻辑运算符xor一起使用。
因此,对于CryptDeriveKey程序接口函数,dwFlags参数的两个低字节(设置结果URL外观的标志)确定了加密密钥的大小。

因此,如果低字节为0080,那么我们请求的加密密钥将是128位RC4密钥。 就像用脚射击自己一样,我会告诉你为什么。

在幻灯片上,您看到一行错误的128位dwFlags键大小-800000,以及一行错误的MSCryptoAPI值。 我将向您展示这个东西的拆卸过程。 您会看到一个名为“初始化加密子系统”的函数:该木马调用加密的上下文,然后为MD5哈希创建一个容器,然后在二进制文件中创建该硬编码密码的MD5哈希,并尝试使用此哈希函数的输出来创建一个128位DES密钥。 但是,在这种情况下,不会创建任何密钥,因为没有诸如128位DES密钥之类的东西。

如果这些API函数中的任何一个失败,它将跳转到我标记为黄色的位置,并显示一条消息,提示无法接收密钥。 这个位置就在这里,它将ebp值(当时为0)移到该布尔值bUseMSCryptoAPI中。
让我们看看这在程序执行过程中会造成什么影响。 我们将遵循代码结构的这一元素,以查看在程序中还使用其他位置以及该特洛伊木马在功能为真和伤口为假时表现出的不同之处。

我们看到在我称为加密数据的函数中检查了逻辑值,即“数据加密”,如果为真,则涉及使用DES加密和CryptEncrypt MSAPI的此块。

但是,如果该值为0,并且众所周知,它将始终为早零,则函数转到该块,默认情况下为xor。

我很好奇恶意程序的作者决定什么时候备份所有这些内容。 也许有人从上面推动他,所以他被迫摆脱了恶意软件,但在最后一刻,他意识到自己的DES无法正常工作,因此他使用xor进行备份记录。 总而言之,这很有趣,所以这个故事的寓意是总是备份!
以下故事称为“您做了什么?”。 我试图提出一个术语来描述Coreflood Trojan的加密方式,并决定将其称为“位置相关加密”。 简而言之,该木马的作者发明了一种新的加密方法。 我以为,也许有人已经写过一篇有关此的文章,应该是“ google”? Google给了我一个美国专利网站的链接,有人在该网站上申请了“基于位置的加密”专利。 该方案非常混乱,因此将花费大量时间对其进行研究。 它的工作方式如下:我向您发送了一条加密的消息,然后为了对其进行解密和读取,您需要携带一个GPS设备,并转到一个由我指示的经度和纬度的点。 通常,加密是安全性和可用性之间的折衷方案,但是这种方法既没有实现又没有实现。

这绝对是不安全的,并且要求您转到发件人指向的地方阅读消息。 马特开玩笑说,如果您正在通过电子邮件在线作战,并且真的想摆脱某人,请给他发送一条加密的消息,使他可以在伊拉克的某个地方阅读,这样您就不会再遇到麻烦了。
Coreflood木马中如何使用此方法? 幻灯片显示了一个代码片段,从中可以看出,特洛伊木马窃取了用户信息后,将其加密并写入磁盘,以便特洛伊木马以后可以接收此信息并将命令和控制上传到其网站。
此函数称为SetFilePointer(设置文件指针),其返回值是dWord,表示超出指针时在文件中所设置的偏移量。 接下来,该函数使用字节数来加密nNumberOfBitesToWrite并将其移至ecx寄存器。 然后,她将数据指针用于加密并将其移动到edx寄存器。

此后,使用xor运算符,它将每个字节放入al和ah缓冲区,这意味着从SetFilePointer返回的低字节和高字节。 因此,该方案中的加密密钥是数据所在文件中的偏移量。 太神奇了!
下一张幻灯片称为“如何重置核心转储”。 它描述了我刚刚编写的dumpCore程序,它刚刚问世。 您可以下载它,这里有所有源代码。 如果计算机感染了Coreflood病毒,则该程序将为您提供帮助。由于某种原因,Coreflood病毒无法通过命令和控制服务器下载被盗的数据。 因此,您可以获取他保存在磁盘上的这些文件,并使用我的程序对其进行解密,以找出从您那里窃取的内容,例如,如果您需要将其告知客户。
被盗数据的日志在幻灯片上以红色圈出。

在Coreflood中,仍然有趣的是:尽管它的加密算法相当弱,但它仍尝试传输有关受害人计算机配置的所有被盗信息,来自银行和信用合作社的所有目标信息,等等。 因此,删除核心转储的另一种方法称为“如何使用Wireshark删除核心转储”。 Wireshark是用于分析以太网网络流量或TCP数据流的程序。

以下幻灯片显示了Coreflood的工作方式。 这些是输入到资源管理器和Internet Explorer中的dll。 他们修改注册表,需要重新启动应用程序,但不需要重新启动系统。 有多种方法可以将这些dll注入到进程中。

对于想要静默入侵病毒的黑客来说,重要的是如何将病毒引入用户计算机:系统是否需要重新启动才能使恶意软件生效,或者用户只需要重新启动应用程序(在本例中为Explorer)。
现在安静了,没人听见!

这是我们使用逆向工程重构的代码。 这显示了Coreflood如何手动关闭资源管理器,以便更改立即生效。 您可能已经熟悉了资源管理器在计算机上发生故障时发生的情况-任务栏消失,所有打开的应用程序的窗口消失,桌面上的所有图标消失,然后它们开始一个接一个地返回到其位置。
Coreflood的作者显然知道这一点,因此他们在该位置放置了一个系统调用,以在OpenProcess调用之前设置导体的“正确”错误模式。
SetErrorMode函数做什么? 它可以防止发送到系统的通知的特定失败,该通知会创建一个小的弹出窗口并发送导致应用程序终止的错误消息。 他们使用此错误消息所做的所有操作都是为了防止在资源管理器失败之前向用户显示弹出窗口。 告诉我什么对用户来说更可疑:一个小的弹出窗口,伴随着屏幕上出现的所有内容消失,然后重新出现,或者所有内容的消失和外观而没有任何错误消息? 我听到你说:“两者都有。”
下一张幻灯片称为“有胳膊和腿,但没有头”。 作为dll加载时,Coreflood不会出现在已加载模块的列表中。 他在堆上分配了一点内存,然后将自己复制到该堆位置-我将其放在一个红色框中。

然后,他删除自己的PE标头,因此,如果您遇到一台感染了该木马的计算机,请说:“我的下一步应该是转储该可执行文件,并将其上传到IDA进行分析”,但是转储该可执行文件非常困难,如果没有其PE标头。 因此,当Coreflood调用虚拟分配时,它会从上到下定义mem标志,这将导致系统返回可用的最高地址,而不是最低地址。 这使特洛伊木马可以在其他系统dll中的用户模式的较高存储区域中隐藏开/闭引号。 因此,下一个演示我称为“如何使所有隐藏的东西都无用”。

当您遇到诸如Coreflood之类的使用隐形功能的东西,并且没有现成的工具可用于处理此类病毒时,您必须创建自己的工具。
如果您熟悉解压缩,那么通常会使用调试器。 尤其是在没有自动拆包程序的情况下,因为这不是常见的算法。 在这种情况下,您可以使用调试器转到原始入口点,然后使用ProcDump或其他实用程序删除Trojan的转储。 PE Import Reconstructor, , , .
, . . Volatility, Internet Explorer . , Coreflood, , . , 7FF81000.

, HEX , Coreflood. , , . .
, , Coreflood, Volatility . , ID Internet Explorer. , , PID 1732. Malfind, , , , . VAD , , . , .

, , 7FF81000. , Fix IAT, PID 1732 Internet Explorer , Coreflood.
dll, Internet Explorer, , RBA , , .
然后,他从7FF81000的内存区域开始分解所有信息,并寻找导致这些导出函数中的任何一个的系统调用。因此,即使没有PE标头,它也可以重新创建导入地址表。您会看到他发出的结果类似于Import Reconstructor的工作结果:有一个模块,第一个功能以及从模块中导入的每个功能。Fix IAT脚本的输出不可执行,因此您可以在PE修改查看器中将其打开,然后查看导入表是否已成功还原。
21:15DEFCON会议17.让我们嘲笑您的病毒! 第二部分感谢您与我们在一起。 你喜欢我们的文章吗? 想看更多有趣的资料吗? 通过下订单或将其推荐给您的朋友来支持我们,
为我们为您发明的入门级服务器的独特模拟,为Habr用户提供
30%的折扣: 关于VPS(KVM)E5-2650 v4(6核)的全部真相10GB DDR4 240GB SSD 1Gbps从$ 20还是如何划分服务器? (RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。
VPS(KVM)E5-2650 v4(6核)10GB DDR4 240GB SSD 1Gbps至12月免费,在六个月内付款时,您可以
在此处订购。
戴尔R730xd便宜2倍? 仅
在荷兰和美国,我们有
2台Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100电视(249美元起) ! 阅读有关
如何构建基础架构大厦的信息。 使用价格为9000欧元的Dell R730xd E5-2650 v4服务器的上等课程?