整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

「安全菜鸡分享」一道送分CTF题发现的搞笑代码段

享的内容


本次分享一下作为一个CTF菜鸡与如下“搞笑”代码的糟心偶遇。



(上图[1],下图[4],然而实际上类似的代码到处都是,也许你公司的代码仓也已经被“攻占”)




References:

[1]. https://www.jianshu.com/p/b854e97fb856.

[2]. https://stackoverflow.com/questions/13433529/android-4-2-broke-my-encrypt-decrypt-code-and-the-provided-solutions-dont-work.

[3]. https://www.jb51.net/article/40941.htm.

[4]. https://github.com/GcsSloop/encrypt/blob/master/encryptlib/src/main/java/com/gcssloop/encrypt/symmetric/AESUtil.java.

[5]. https://github.com/GcsSloop/encrypt/issues/4

[6]. https://www.it1352.com/558636.html

[7]. https://stackoverflow.com/questions/36813098/securerandom-provider-crypto-unavailable-in-android-n-for-deterministially-gen


开始讲糟心的偶遇故事


作为一只CTF菜鸡,当遇到一道送分APP题时,是多么的开心;但是因为菜,这么简单的开心,ta就是不给你!


题目思路:

l 使用私有的Base64算法(代号:PBase64)处理了flag的密文(代号:PBase64.en(AES.en(flag))),而私有的Base64算法,实际上只是对标准Base64算法的table进行了替换;

l 密文(AES.en(flag))为flag使用固定的密钥,使用AES算法加密得到;//此处AES实现与[4]一致~

l 需要对部分代码进行逆运算得出PBase64.en(AES.en(flag)),处理逻辑主要为亦或,逆运算还是亦或。//开心是吧?


解题思路:

1. 反编译APK拿到代码;

2. 简单写个Java程序,逆出PBase64.en(AES.en(flag))

3. 根据私有Base64算法的table和标准Base64算法table的字符对应关系,由PBase64.en(AES.en(flag))还原出Base64.en(AES.en(flag)),使用标准的Base64库decode计算得到AES.en(flag)

4. 抠出APK里AES的实现,本地写个程序调用AES的decrypt方法使用固定密钥解密获得flag,得分!


1&2&3都很顺利,但是Too Young Too Simple! 你就是解密不出来:Such issues can arise if a bad key is used during decryption


晕,难道是菜鸡误会了题目? 等公布答案,看看大佬们的Writeup学习一下吧。

。。。。。。

晕,不就是我这思路解的吗!Base64.en(AES.en(flag))都和我算的是一样的,为啥我就解密不出来?

。。。。。。(捣鼓了半天)

原来是SecureRandom在Windows平台和Android平台不一致导致,导致密钥不一致,分析题目的时候没仔细看(需要反省),密钥还有这么生成的!神了,也许这才是这个题目的精髓吧?


So 为什么说这段代码是“搞笑”的?


这位老哥给出了完美答案[7]:


根据密码学实践,Java的SecureRandom原本就不应该用来派生密钥,而应该使用更为专业的密钥派生算法,比如PBKDF2;因为SecureRandom的具体表现,依赖底层随机数发生器的实现,如果随机数发生器不一致,即使你set的种子seed(不同的封装中参数名可能不一样,如[1]中就叫seed,[4]中叫password)一样,结果也会不一样,导致不同平台甚至不同Android SDK版本计算得出的密钥都不一样;也就会出现一个平台加密的密文,使用同样的password,在另外的平台解密不出明文的异常情况,即CTF菜鸡本次的遭遇。


理论上正确的实践(使用PBKDF2或类似算法派生密钥),应该出现在各大公司的安全编码规范、安全设计规范、密码学应用规范等等文档中。


但是,随便搜索一下,会发现使用类似逻辑派生密钥的AES封装以及相关帖子[1]~[7]随处可见,说明坏代码的扩散能力和好代码一样强。甚至有兄弟分析了为什么这种方案Windows和Linux上跨平台解密异常的情况,还给出了“解决方案[6]”,但却不是把SecureRandom换成类似PBKDF2这样的专业算法的满分答案,可惜了。


再扯一个很容易被忽视的SecureRandom使用实践吧


Java的SecureRandom是一个可以用来高效产生密码学意义的安全随机数伪随机数发生器,它还是个伪随机数发送器,并不是真随机数发生器,多用在某些需求密码学意义的安全随机数场景,如AES的IV值。

但是呢,千万要注意,这种场景下,千万千万千万千万千万不要手动给SecureRandom实例setSeed,就像上面提到的“搞笑”代码一样。

因为set了固定的或不安全的种子seed后,Java的SecureRandom就退化为一个纯纯的伪随机数发生器,也就产生不了密码学意义的安全随机数。

先是旧闻一则:日本一名 13 岁女孩在网上遭遇 Javascript 无限弹窗,然后觉得好玩而将代码在论坛上进行分享,结果遭到了刈谷警方的询问和指控(果然让熊孩子碰电脑容易出事……)。此事引发了广泛争议,以至于日本程序员 Kimikazu Kato 在 GitHub 上发起了快来逮捕我的抗议活动,呼吁大家一起分享 JS 无限弹窗代码,让日本警方来逮捕他们或者去警局自首。

这段无限循环代码主要影响桌面版 Chrome 和移动浏览器,而 Edge 和 Firefox 浏览器则不受影响,可以正常关闭窗口。代码是在 2014 年写的,已经被很多人分享过,而这名女孩不是唯一一位受到调查的,还有另外两人受到调查。

我们且不说程序员 Kimikazu Kato的做法正确与否,我们今天就在技术无罪的前提下,来讨论这段代码,咳咳,敲黑板,接下来便是重点.

以上便是代码的全部内容,下载下来重命名为index.html,然后上传到任意服务器,再打开你的链接/index.html。嘿嘿嘿,之后便会无限弹出:“你是猪吗?”,并且关都关不掉……那场面,啧啧,难以想象。这里建议用电脑,修改文件名后直接双击打开就可以在浏览器预览了。

注:小库仅进行技术分析,不承担任何责任,听说出了事是要扣鸡腿的。️️

多人都被大大小小的一些有趣的小网页玩弄过吧!今天教大家用一个小文本写一个简单的恶搞网页!

炒鸡炒鸡简单哦!

第一:在电脑新建一个txt文件;

新建文本文件

第二:把下面的代码copy到文本文件里面,这些文字是可以随便修改的哦;然后把文件后缀改为html;

<html>

<head>

<title>网页特效---很恶心的常见整人效果</title>

</head>

<body>

<a href="" onMouseover="alert('为什么把鼠标放到这里?');

alert('我不是说过不可以这样吗?');

alert('你把我的话当什么了?');

alert('你知道错了吗?');

alert('什么?你居然....');

alert('居然还没意识到自己做错了?');

alert('那好,你要为此付出代价!');

alert('我要你在这里点足一千下......');

alert('什么?你开始有点后悔了?');

alert('何必呢?');

alert('你当初干什么去了?');

alert('不原谅你!');

alert('好从现在开始再点995下......');

alert('你的手开始累了吗?');

alert('什么?你已经没力气了?');

alert('你一直在求我原谅你啊!');

alert('看来你是真的知道错了!');

alert('下次你还会这么做吗?');

alert('真的不会了?');

alert('那好,今天就放你一马!');

alert('写封信给我说声对不起!');

alert('你能这么做我很高兴!!!');

document.bgColor='black';

document.fgColor='White';

window.location.href='mailto:mygod@god?subject=对不起,下次不敢了!';">不许把鼠标移到这里</a>

嘻试吧爽噢。。

</body>

</html>

就是这样子

第三:直接打开这个就好啦,不瞒你们说,小编刚刚打开的时候自己正在编写的文章重新写了一遍!

我就不展示运行效果了;

每天都会更新一篇简单的小软件 小程序呦! 不更你打我