我正在尝试对协议进行逆向工程(这是针对其服务器即将关闭的游戏)。我有两件事:1)程序的二进制文件2)Wireshark的数据包转储(如果需要,我仍然能够获得另一个转储)。现在,从转储中可以看到,该协议已加密TLS / SSL(不确定哪个)。我知道Wireshark具备解密这些数据包的功能,因为我拥有必需的密钥..但是,我到底是如何从二进制文件中提取密钥的呢?

tl; dr我可以吗?给定原始二进制访问纯文本SSL?

评论

要回答标题中的问题:不,如果没有密钥,则无法解密SSL连接。蛮力将花费比宇宙时代更多的时间。

吉尔斯:我在拆解过程中还能有运气吗?

@bobbybee-否。请参阅此线程:SSL如何工作?那里有三个极好的答案。 ;)

实际上,您的问题更多:«如何通过对客户端进行反向工程来破解SSL连接? »。因为确实知道,当您尝试从外部破解SSL时,SSL是安全的,但是当您完全控制连接的一侧时会发生什么呢?这是您必须调查的内容(以这种方式编辑和重新说明您的问题,您将获得更多相关的答案)

@吉尔斯:我不同意最后一句话。它应包括“以当前的计算速度”之类的内容。我们也不能排除将来会解决素数分解问题。

#1 楼

如果在二进制文件运行时可以访问它,则即使具有完美的前向保密性,也完全有可能提取出解密SSL / TLS会话所需的密钥。有一个48字节的密钥,称为主密钥,由双方共享,用于生成连接的会话密钥。

如果应用程序使用标准的Win32 API进行SSL连接时,拦截密钥生成的点位于lsass.exe内部,位于:

Caller:  ncrypt!_Tls1ComputeMasterKey@32+0x57 
EIP:     ncrypt!_PRF@40+0x11a

Azure”。

更一般地说,我(与几位杰出的合著者)最近开发了一种技术,用于扫描所有内存访问以查找有趣的数据,例如SSL / TLS密钥。关于此的论文(“ Tappan Zee(北)桥:挖掘用于自省的内存访问”)已在CCS上发布,并且可以在github上找到进行此操作的软件:PANDA / TZB。特别要看一下keyfind插件,该插件获取一个样本(加密)数据包,并扫描内存访问以获取TLS主密钥。

查找在新应用程序中发生TLS主密钥的位置的过程是:


使用PANDA创建建立加密连接的应用程序的记录,并保存数据包捕获(在QEMU监视器begin_record <session_name>中,运行该应用程序,然后运行end_record <session_name>
在数据包捕获上运行scripts/list_enc.py以提取keyfind插件所需的信息,然后将此信息放置在keyfind_config.txt中。
使用命令行中指定的begin_replay <session_name>运行会话的重播(QEMU监视器中的-panda-plugin x86_64-softmmu/panda_plugins/panda_keyfind.so)。一个(很长)的时间,它将吐出已读取或写入匹配的TLS密钥的代码位置key_matches.txt

该文档目前还很粗略,但是查看源代码可以解决您有任何疑问(请随时在此处进行澄清!)。

有关为此使用熊猫的更多信息,请参见:此处

#2 楼

正确实现的SSL流量具有前向保密性。这意味着即使您拥有整个数据包转储和必需的私钥,也无法对其解密。正如
Brendan Dolan-Gavitt在回答中指出的那样,您需要在二进制文件运行时访问它。

您可以尝试使用ettercap之类的工具设置SSL mitm。根据SSL的实现,可能涉及到其中的部分内容,但可能无法正常工作。

现在,不是您问题的直接答案,但它可能会帮助您实现所需的目标:

您可以做的另一件事,因为您的目标是分析潜在问题协议是在更高级别上进行挂钩。我之前使用过oSpy做类似的工作。


oSpy是一个工具,可以对在Windows平台上运行的软件进行逆向工程。随着当今存在的专有系统的数量(同步协议,即时消息等),当开发可互操作的解决方案时,保持传统系统所需的大量工作将很快成为一大负担。但是,当在API级别完成嗅探时,它可以让您更精细地了解正在发生的事情。

oSpy的工作原理是附加到您要分析其流量然后监视某些API的进程。

评论


应该在第一句中强调适当实施;)

– 0xC0000022L♦
13年8月26日在18:08

确认并更正:)

–0xea
13年8月26日在21:16