このドキュメントは、一通りゲームを楽しんだ後に読んで下さい。

by yoshinov@aa.cs.keio.ac.jp
(1993.7)

以下に添付するプログラムは、匿名希望の某氏の作られたmat.c (Massive ATtack for passwdbattler)です。Monster Attack Teamの略ではありません。 自分の選んだパスワード文字列から生成できるcrypt暗号列をべろべろ弾き出 すと言う恐ろしいツールであります。(そのパスワード文字列の中では)最強 のものをお気軽につくり出すことが出来ます。

なお、匿名希望の作者とはネットワークでは大変有名な(た)という方らしい、 という噂も流れておりますが…。

では、プログラムの説明を作者御自ら語って頂きましょう。


引数はありません。暗号化されていない生のパスワード候補を2回入れて、2 回とも一致すると、可能な permutation 4096 種とその評価値がべろべろ出て きます。後は、ファイルに入れたり sort -n |{head,tail} するだけ :-) 2回入れたパスワードが一致しないと打ち間違いということで、一致するまで 入れなおさせられるようです:-) 最強の permutation が見つかったら、そのまま NIS サーバホストの /etc/passwd に突っ込んじゃってくださいB-)


/* mat.c (Massive ATtack for passwdbattler) */
/* Name of the author unknown */

#include <pwd.h>
#include <strings.h>
#include <ctype.h>
#include <stdio.h>

extern char *malloc();

char *saltTable = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";

Eval(s)
    char *s;
{
    int ii;
    int len, total = 0;

    len = strlen(s);

    for (ii = 2; ii < len; ii++)
	total += (isupper(s[ii]) ? (s[ii] * 16) :
		  (islower(s[ii]) ? (s[ii] * 8) :
		   (isdigit(s[ii]) ? (s[ii]) :
		    (-(s[ii] * 32)))));

    return (total);
}

int
main()
{
    char salt[2], *i, *j, *saltEnd = saltTable + strlen(saltTable), *tmp;
    char password[16], encryption[32], tmpEncryption[32];
    int ii, len;

    while (strcpy(password, getpass("raw password:")) &&
	   strcmp(password, getpass("type again  :")) &&
	   fprintf(stderr, "password incorrect; please try again\n"));
    for (i = saltTable; i < saltEnd; i++) {
	*salt = *i;
	for (j = saltTable; j < saltEnd; j++) {
	    *(salt + 1) = *j;
	    strcpy(tmpEncryption, strcpy(encryption, crypt(password, salt)));
	    for (ii = 2, len = strlen(tmpEncryption); ii < len; ii++) {
		tmp = crypt(tmpEncryption + ii, tmpEncryption);
		*(tmpEncryption + ii) = *(tmp + ii);
	    }
	    printf("%d %s\n", Eval(tmpEncryption), encryption);
	}
    }
    return (0);
}


HTMLization by kabe@sra-tohoku.co.jp