slont_code -4ページ目

slont_code

// 人と知識をつなげるcode

文字や数字の順列を作って総当たり…みたいなことをやりたいなーと思って、適当に書いてみました。

Permutation.java
/**
* @author slont
*/
public class Permutation {
private int number, list_size, searched, next_index;
private int[][] perm_list;

/**
* 引数の長さの順列を生成する
* @param num
*/
public Permutation(int num) {
this.number = num;
this.list_size = this.fact(this.number);
this.searched = 0;
this.next_index = 0;
this.perm_list = new int[this.list_size][this.number];

this.create(0, new int[this.number], new boolean[this.number]);
}

public static void main(String[] args) {
Permutation pmt = new Permutation(4);
while(pmt.isNext()) {
printNum(pmt.nextPerm());
}
}

/**
* 生成された順列をint配列で返す
* @return int[]
*/
public int[] nextPerm() {
this.next_index++;
return perm_list[this.next_index-1];
}

/**
* 取り出せる順列が存在する場合にtrue、存在しない場合はfalseを返す
* @return boolean
*/
public boolean isNext() {
if(this.next_index < this.list_size) {
return true;
} else {
this.next_index = 0;
return false;
}
}

/** 引数の階乗を返す **/
private int fact(int n) {
return n == 0 ? 1 : n * fact(n-1);
}

/** 順列を作る **/
private void create(int _num, int[] _list, boolean[] _flag) {
if(_num == this.number) {
copyArray(_list, perm_list[this.searched]);
this.searched++;
}
for(int i=0; i if(_flag[i]) continue;
_list[_num] = i;
_flag[i] = true;
this.create(_num+1, _list, _flag);
_flag[i] = false;

}
}

/** int配列をコピーする **/
private static void copyArray(int[] _from, int[] _to) {
for(int i=0; i<_from.length; i++) _to[i] = _from[i];
}

/** int配列を標準出力する **/
private static void printNum(int[] _nums) {
for(int n : _nums) System.out.print(n);
System.out.println();
}
}

出力
0123
0132
0213
0231
0312
0321
1023
1032
1203
1230
1302
1320
2013
2031
2103
2130
2301
2310
3012
3021
3102
3120
3201
3210


使い方はmain関数の中です。私が直感的に使いやすいようにnext()みたいなの使ってますが、生成したものを直接使っても良いです。再帰を使っているので、数字10個とかになると結構アウトです(笑)参考までに。
ksnctfをマイペースでちょこちょこやってます。初見で解けたものはあんまりないけど、ぐぐったりして結構わかるもんですね。全部ではないですが、自分なりのwrite upを載せておきます。

Q7. Programming
スペースが何を意味しているのか…トリビアですね。

Q9. Digest is secure!
これはすごい勉強になりました。Digest認証とはなんなのかとにかく調べる。後はどうやってリクをごにょごにょ…

Q12. Hypertext Preprocessor
PHPのCGI
スクリプト実行
ディレクトリ検索

Q13. Proverb
個人的にはハッキング!って感じを得られる楽しい問題でした。ファイルはコピーできないnoni
/tmpを使うってことは、/tmp以下に上手く…

Q16. Math I
RSA暗号。高校数学(中学数学?)で解けます。

Q17. Math II
普通に探索したら時間がかかりすぎます。

Q22. Square Cipher
これは気付けたら嬉しいですね。メモ帳じゃキツいかな。

Q26. Sherlock Holmes
面白い、というか、こんなに簡単に見られると怖いですね。コマンドを知っていればきっと…

Q32. Simple Auth
こんな脆弱性のある関数を認証に使ってはいけませんということでしょう。
先日スマホ(Android)でAnitubeを見ようと思って開いたら、何故か再生ボタンが表示されず、見れませんでした。調べてみると、Android版のAdobe frash Playerが必要らしいんですが、これは現在公開されておらず、Storeで検索してもヒットしませんでした。(ちなみに、Adobeが提供していない、偽のAdobe frash Playerが何個かありましたが、こちらは絶対にインストールしないでください(笑)これらの偽アプリは提供がAdobe Systemsではないはずです。)
ともかく、frash playerが手に入らないので、ユーザエージェント変えればいいんじゃね?ということで、ブラウザを探してみて、Habit Browserを入れてみました。
 Habit Browser
インストールしたら、「Setting」→「General」→「User Agent」を順に選択して、PCかなんかに変えれば、スマホでも見れるようになると思います。
他のブラウザでも可能だと思うので、試してみてください。

先ほどfrash player検索したら、その偽アプリは消えてましたwwスクショ撮っておけば良かった(笑)