实战 | 从《白夜追凶》到24小时成功逆向一款数字签名的距离

270 阅读5分钟

这段时间号称“年度最高分国产罪案剧”的《白夜追凶》正在热播,小编这两天追剧追得也是有点恍惚了,尤其是看到可爱的黑客小胖那个“工作室”,着实让小编有些着迷呢......

什么叫我行不行啊

你当这是看那脑残电影呢

一按回车

这白宫厕所什么样都让你看得

一清二楚啊

现在的交通监控系统

防火墙至少都是六十四位加密的

你但凡涉及到安防监控

甚至可能是一百二十八位加密的

你这还不算咱破译之前的

那些什么身份验证 电子授权的

观|后|感

看完这个片段,大家应该 Get 到了几点:1.黑客的所做的工作可不是最后按下回车那么简单,虽然剧里最后小胖还是看似简单地呱地一下按了回车让关宏宇看到了实时的交通监控画面;2.安全永远都是矛与盾的关系,没有绝对安全的系统,即便是做了如此高级别防护的系统同样可以被攻破,这绝对不是段子;

事实上安全系统的搭建复杂程度和难度可比攻破它要大多了,在安全领域目前大多数加密算法、安全系统和网络还都是国外的一些专家和机构研究发明、构建和发布的,国内的大多数安全专家的建树还只停留在破译破解方面。

此外,在市场经济的作用下,国内大多数公司在忙着赚钱的同时,在安全方面的投入可少得可怜,很多公司的用户密码甚至是明文存储,除了这些公司的领导层对安全没有足够的重视、投入等主要原因外,作为程序员,大多数也很少有这方面的意识。

案例分析 案例背景

这款软件最初的版本对于网络请求并没有任何的保护,也就是说只要通过模拟,服务器同样会正确响应所有来自模拟客户端的网络请求。后来加入了数字签名的校验,是不是这样就安全了呢?不然......

从上图可以看到,网络请求增加了signature字段的校验,只要签名不正确,服务器将不会响应响应的内容。

案例实战

这样的保护相信对于普通程序员和应用来说已经足够了,至少有了这层保护大多数人无法通过最直接的手段进行模拟请求,一般国内的应用能够做到这样,已经算良心的了。而今天的目标是告诉大家如何使用非常规的手段,获得这款数字签名的算法明细,从而希望大家进一步提高安全意识,不是这样做了就代表可以高枕无忧了。

当然,在这个案例中,就算是数字签名攻破了,也没有太大的危害,在某些类型的应用中,那可就说不定了.....

通过观察,这个signature的字符串是一个64位的字符串,一般有经验的程序员可以很快猜出这是数字签名使用的是sha256的算法,当然这不是绝对的,后面会进一步对这个想法进行验证。另外,这个signature一定是其他三个key加上一个客户端key以某种方式拼接后在通过某个数字签名算法“加密”获得这个字符串的。

但是,具体又是如何拼接的呢,我们不知道,需要我们进一步的分析......

通过逆向工具(IDA)反编译出诸如上图的经过处理的类汇编代码,通过对代码的分析,我们可以轻松的知道客户端的key就是对应的上图中的client_secret_key字段,通过观察,这段代码虽然可以看出一些端倪,然而要正确了解数字签名的逻辑,并不是一件轻松的事,因此对于逆向工作来说,有很大一部分工作是猜测,当然是有根据的猜测,通过不断地猜测和验证,才能获得你想要的结果,这个过程可能很快,也可能很漫长,通过不断阅读分析、猜测和验证,我们得到一下的结论,该数字签名是通过将各个参数连同客户端key以键值对按key升序排序后用等号连接,再在其中间用&进行拼接进行sha256散列函数运算后得到,结果是这样的:

NSString *raw = @"client_id=000000&client_secret_key=853k3a3qfq6g9qutefaicvn7jsaww09m&nonce=477570&timestamp=1508293067";

NSString *signature = [raw sha256String];

经过验证,signature的值的确就是:

e30de3e862f1385ca606ccbe576b78fd5a79c6273c20c67d048c5721c114e8c2。

与图中完全一致,虽然上面描述比较简单,整个过程大概用了24个小时的时间。

案例总结

通过这个实战案例的分析,希望引起大家对安全的足够的重视,各位老板在赚钱的同时也要守住一些社会道德底线,对您的用户的权益做好最起码的保护;作为程序员,也不能只光想着实现功能,安全意识也一定要有。

继续追剧中......