Nodejs之Crypto模块的使用

cover-image
好吧。好久没更新了,最近也是忙着考国二C语言,各种临时抱佛脚,也没心思写东西了。上礼拜日也是跟学长组队去参加了一个校内的CTF,神奇的是还拿了个第二名~其实我们是去纯打酱油的> <。

其中一道题挺有意思的,题设就记不清了,大概就是给了你一个IP和端口,我们telnet上去就显示这样:

Welcome to game space
Your ip: 172.16.37.125
There have a question for you
If you pass it, i’ll give you the key. #$*!@#$!@
Question: the “S” is? (Hint “S” is string of alphanumeric)
(“K0M1OHNHn2WX” + “S”) -> md5(fb61d14280636c25547a2482dacb5817)
Input “S”:

大概意思就是把”K0M1OHNHn2WX”这个字符串和S这个字符串拼接之后md5然后得到后面那个MD5密码。

我们用js写一段代码来匹配这个东西。

1
2
3
4
5
6
7
8
9
10
11
12
//加载MD5.js
(function(){
q = "K0M1OHNHn2WX";
s = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890".split('');
s.forEach(function(a1){
s.forEach(function(a2){
s.forEach(function(a3){
s.forEach(function(a4){
if(hex_md5(q+a1+a2+a3+a4)=='fb61d14280636c25547a2482dacb5817')
return a1+a2+a3+a4;
});});});});
})()

至于怎么知道是四位的,多试就知道了。还有一个细节是这个字符串每次都是会改变的。3位的话在我的Air上跑完大概只要十秒,可以忽略不计,四位的时候大概花了两分钟多,但是这个Telnet在60s的时候会断开连接,出题者限制了时间,如果按照这个程序,大概就要分组跑了,我猜是那个用于MD5加密的函数库比较慢的关系。

于是乎,回来拿node的crypto库写了个一样的程序,我们可以看到node是单线程的,四核心的处理器只能用一个线程,CPU100%。

node CPU

1
2
3
4
var hex_md5 = function (str) {
str = str.toString();
return require('crypto').createHash('md5').update(str, 'utf-8').digest('hex')
};

Node MD5

我们可以看到尼玛这个坑爹啊 只要30多s就可以了啊=-=

好吧。下次CTF继续加油把~是时候撸高数去了。。。