高考总分36,大学聘我当教授
繁体版

第四十三章 破解!SM2的秘密!

    从小跟老陈这个糙汉子生活在一起,林耀似乎从没感受那种细致的关爱。

    眼下周楠楠的照顾反而让他下意识想逃避:

    “不用忙了,我自己随便吃一口就行了。”

    周楠楠白了他一眼:

    “什么随便吃一口啊,中午就没吃饭,晚上再不好好吃怎么受得了。

    再说我一直等你还没吃晚饭,你以为都是给你留的嘛。”

    不管林耀的反应,她自顾自的把菜重新热了一遍:

    “什么事那么重要,饭都顾不上吃?”

    林耀端起热好的菜放到餐桌上:

    “工作上的事,忙起来就忘了。”

    周楠楠给林耀盛了一碗汤,欲言又止的看着他。

    林耀被盯得不自在,抬头问道:

    “怎么了,我脸上有什么好看的吗?”

    周楠楠端起碗,用筷子戳动几下米饭还是忍不住问道:

    “下午我本来想喊你出来吃饭的,看你好像在扫描什么网站。

    上面好多我看不懂的代码,学校里大家都说你的技术比什么黑客都厉害。

    小林子跟我说实话,你没干什么违法的事吧?”

    林耀愣了一下,之前他一直沉浸在巨大的深网信息里,根本没注意周楠楠竟然进过他的房间。

    “你说对了,我其实是国外来的间谍,既然秘密都被你发现了,那我只能杀人灭口了。”

    林耀装出一副凶狠的模样吓唬着她。

    周楠楠仰着头哼了一声:

    “你打得过我吗?别忘了中午......”

    提到中午两人都露出一丝尴尬,周楠楠赶紧岔开话题说道:

    “我看早上来的那个人不像什么好人,还说送了你一套别墅。

    别人为什么要送你那么贵重的东西,你可千万别犯傻。”

    林耀见她一脸认真,伸手拍了拍她的脑袋:

    “别瞎想,你以为我跟你一样吗?我可是燕山科技大学的教授。

    你也说了我的技术可以比那些黑客还要好,别人找我帮忙给点好处不是很正常吗。”

    周楠楠好像才意识到林耀虽然和她同龄,却早就不是和她一样的普通学生,而是知名大学的教授。

    “你说的倒也对。”

    小女孩的心思总是变得很快,接受一切后周楠楠立马又好奇的问道:

    “小林子,你什么时候搬去大别墅住啊,你还这么小就有自己的家了哎。

    早知道小时候我就跟你一块学电脑,练武术能有什么用呢。”

    说到这,林耀才意识到好像周楠楠和李婶在燕京呆了这么多年好像还没有过属于自己的家。

    “这里就是你家啊,我能白吃李婶那么多年饭吗?

    把客房收拾出来,以后你想什么时候来住都行。”

    周楠楠挑起一筷米饭塞到嘴里,一双眼睛却不由得弯下来露出一丝笑意。

    吃过这顿迟来的晚饭,林耀摸着肚子回到房间。

    看了一眼房门,还是起身反锁起来。

    此时Hacktronian工具上的扫描出来出来的漏洞已经多达20几个。

    林耀筛选出所有关于加密算法的内容,其中一条内存写入异常引起了他的注意。

    他尝试在模拟环境中找到写入位置,然后调用日志查看刚才漏洞出现的原因。

    SM2的密文解密一般需要调用两次pkey_sm2_decrypt。。

    第一次调用pkey_sm2_decrypt函数,指针out为NULL。

    这时候系统会通过OPENSSL_malloc分配一块对应返回长度大小的堆内存。

    第二次调用pkey_sm2_decrypt,指针out为第一次调用所分配的内存。

    正常来说,两次的返回长度是相同那么内存就不会产生溢出反应。

    但Hacktronian在测试循环的时候,第一次的输入使用了设定好的MAG格式解析这组密文。

    解析后密文共14个字节,那么系统就自动为其分配了14个字节的内存空间。

    而OPENSSL框架下的SM2算法采用SM3算法作为算法步骤中的哈希算法。

    而SM3算法的输出是256比特的哈希值。

    所以在返回程序中它生成的密文只占用了12个字节。

    内存没有被完全占有,虽然这个结果不会对系统产生任何影响但是也被日志记录了下来。

    林耀看着日志记录的结果,一个想法浮现在他的脑海中。

    如果说SM2的第二次计算会采用固定的哈希格式进行解密。

    只要他能找到比哈希算法占用字节更少的解密格式,比如得到只有10个字符的解密结果。

    那么解密后12字符结果就会大于分配内存时的10字符容量造成内存越界写入,触发堆溢出漏洞。

    这就好比你的前女友如果找了个普通人做男朋友并不会让她有特别的感觉。

    但如果她在你之后找了个“天赋异禀”的男人,那么就会产生溢出反应。

    这个想法如同黑暗中的一盏灯,让林耀一下就找到了方向。

    他模拟使用的密文,按照哈希算法格式解密之后占12个字符。

    那么存在比12字节更小而且符合SM2方程规律的解密算法吗。

    或许知道的人不多,但是醉心渗透的林耀第一时间就想到一种相对小众的密码学专用语言ASN.1。

    ASN.1是一种跨平台的数据序列化的接口描述语言。

    它早在80年代就被开发使用过,但因为它没有提供单一的开源实现,大多数时候作为第三方供应商实现来使用。

    所以愿意花时间去学习这种语言的人并不多。

    林耀试着把模拟密文用ASN.1进行解密后得到一个固定字符串。

    11!

    看着出现的结果,他不由得攥紧了拳头:

    “Nice!!”

    深吸一口气,林耀把结果输入到OPENSSL的写入位置。

    检测视窗内,一条红色的堆溢出异常几乎同时显示出来。

    out指向的内存是11字节,而解密结果是12字节,越界写入1字节。

    林耀激动的站起身来直接给老陈打去微聊视频通话。

    过了好一会黑漆漆的摄像头里才换来老陈疲倦的声音:

    “林耀,现在几点了,还开视频?”

    林耀没有说话,把摄像头反转对准电脑屏幕。

    另一头传来一阵悉悉索索的翻动声,应该是老陈在到处摸索眼镜。

    片刻后,手机里突然传来一声公猫般的尖叫:

    “我去!!林耀,你小子真TM行啊!!!等着!我现在就开车回家!!”