道民学生プログラマの憂鬱

やるきになったら書く

数学でよく使う文字とその意味

ネタがなさ過ぎて困った。

物理とかも入ってる。
とりあえず表的なのを作ってみた。

文字 意味
a 汎用
b 汎用
c 汎用、定数、光速
d 汎用、差、微分
e ネイピア数、汎用
f 関数、力
g 関数、重力、重力加速度
h 高さ
i 虚数、インデックス
j 虚数、インデックス
k 虚数、インデックス
l 線、長さ
m 整数、自然数、質量
n 整数、自然数
o 原点、円、点
p 点、素数
q 点、素数
r 半径、汎用
s 面積
t 時間
u 汎用
v 汎用、速度、体積
w 汎用、重み
x 方程式、わからない数、座標、グラフ
y 方程式、グラフ、座標
z 方程式、座標

ギリシャ文字はもっとあるでしょう。

余談ですが、√は、r を変形したものらしいです。

8946 解説 21~30

久しぶりに書きます。

take21

ここはちょっと難しいかもです。
答えからいうと。

curl --verbose http://www.hackerschool.jp/hack/take21.php

すると、書いてあります。
よくわかりませんけど。
ソースにあるパスにまんまと引っかかりましたwwwww。

take22

説明不要。
FirebugとかF12キー押したりして、デベロッパーツールでいけます。
もしくは、POSTするデータを書き換えればイケルで。
maxlength

take23

HackMeのlv1........
説明いらない。
正解率21%.........

take24

ここからが本番でしゅ。

まずは、booksから適当な年代にアクセス。

http://whitecafe.moe.hm/books.php?sql=%24t%7Btr%25+Y+u%23%7E%7C+13%40%40%3CD1+%28wt%23t+152E61+ml+%60_faggag__+p%7Ds+152E61+kl+%60%60_cd_da__+%7E%23st%23+q%2A+1%3F2%3E61+p%24rj

怪しい....
とりあえずURLデコードしよう。

sql=$t{tr%+Y+u#~|+13@@<D1+(wt#t+152E61+ml+`_faggag__+p}s+152E61+kl+``_cd_da__+~#st#+q*+1?2>61+p$rj

うん、これは何でしょうか。
Base64ではないなー、と思います。調べてみるとrot47なるものがあるらしいですね。
デコードすると。

SELECTZ*ZFROMZ`books`ZWHEREZ`date`Z>=Z1072882800ZANDZ`date`Z<=Z1104505200ZORDERZBYZ`name`ZASC;

ちょくちょく、Z が入ってるけどこれなんだろう...
と思ったら「+」がrot47で「Z」になるみたいですね。
+は、スペースに置き換えましょう。

SELECT * FROM `books` WHERE `date` >= 1072882800 AND `date` <= 1104505200 ORDER BY `name` ASC;

では、これからはROT47 => URL ENCODE でいけるでしょう。
でも、ただURL書き換えるだけだとだめなようで、リファラーを偽造しなければいけない(?)ようで、
curl等をつかって。

curl -e http://whitecafe.moe.hm/books.php http://whitecafe.moe.hm/books.php?sql=

をしなければいけないようです。
説明面倒なので、途中を端折ります。

SELECT * FROM members;

で、パスワードですがSHA-256であるのは明らかで(可変長SHA-3(SHAKE)である可能性もありますが)、INSERTでユーザーを追加してもうまくいきません。
理由は、パスワードはSHA-256が10000回重ね掛けされてるから。
で、どうやってそれを知るかというと、「Hall of shame」にいって、
「8946」「password is "8946"」が、います。
これは、先人がヒントを残したのではなく、公式にこれが用意されているようです。
で、これは実際にログイン可能なので、あとはプログラムかいて何回重ね掛けされているかを調べる。。。。
らしいです。
これは難しかったです(上の比じゃないw。
あとは頑張ってください

take25

プログラムかくだけ。 (24で疲れて説明テキトー
PHPおすすめです。(デフォでsha256用意されてる。(C#もあるけど、文字列に変換する必要がある))

take26

難読化をきれいに整形すればわかるよ。。。 (投げやり

take27

pass = seconds * (time + 1) * (document.form1.pass.value % 2);

ここ。
とりあえず、奇数にする。
積は437になればいい。
437の約数は、1,19,23,437 。
あとは、上の条件を見たす解を見つけましょう。

take28

ilspyつかお(ボソッ

take29

うぬぬ。
わかったら追記します

take30

wolframで求めよう。

終わり

今回は24以降適当です。
24つかれた。
次がいつになるかはわかりませぬ

次 -> shaige1120.hatenablog.com

いろんなRand()

前書き

各言語や、コンパイラでRand関数の実装は異なります。
今回はいろんな実装を紹介していきます。

Visual C++

Visual C++ での実装は以下の通りです。

long visual_cppx = 1;
void srand(long a) { visual_cppx = a; }
int  rand(void) { visual_cppx = visual_cppx * 214013 + 2531011; return(int)(visual_cppx >> 16) & 32767; }

このような実装になっているらしいです。 (参考文献より。
C#は、公式にコードが公開されているのでそちらを見てくださいということで。

UNIX /usr/ucb/cc

にあるrand.

long usr_ucb_cc_rndx = 1;
void srand(long a) { usr_ucb_cc_rndx=a; }
long rand(void) {/* x = x * 1103515245 + 12345;*/ return (usr_ucb_cc_rndx * 1103515245 + 12345) & 2147483647; }

参考文献では、独自に調べているようですがどのように調べているんでしょうか。
独自に調べようにも、やり方がわからんのです。。。
いくつか乱数を生成して、そこから推測するのでしょうが....
やり方わかる人いたら教えてください。

逆アセンブル

したらいけるかもしれないけど...
Pythonとかスクリプト言語だと通用しないですよねぇ....
参考文献をまとめまとめたコードをGistに置いときます。
rands.h - Gist

参考文献

良い乱数・悪い乱数

8946 解説 11~20

11-20


take11

urlの末尾に?file=index.htmlがあります。
ディレクトリトラバーサルの問題ですね。
../etc/passwdとか試してみましょう。
すると同一フォルダにpasswd.txtがありました

take12

ちょっとわかりにくいですが、urlにsvnとあるので、svnで管理しているのでしょう

/hack/svn/.svn/text-base/index.php.svn-baseにありました。

take13

GIMPとかに投げましょう

take14

if (input_id.value == 8946) {  
    input_id.value = '';//入力されたデータを「空」にする処理 m(_ _)m  
    alert("残念!");  
}  

とあるので、Firebugとかで、空にする処理を消しましょう。

または、

"><script>function  fnFormSubmit(){form1.submit();}</script> 

を送信して
8946を送信するという方法でもいけます。(これが正規法っぽい)

take15

ソースでは take15_answer.php を開いているので、見てみましょう。

curl http://www.hackerschool.jp/hack/take15_answer.php

で見れます。

take16

2進数なので、変換しましょう。

take17

<!--見つかった・・-->

バイナリを変換 → 変換した値.html

<!--見つかった・・その2-->

にこたえがあります。

take18

手作業で頑張ってくださいww

take19

idとid2はurlから渡しましょう。
http://・・・.php?id=1&id2=99
passはrot13します。 で、あとはFirefoxのコンソールからポストしてあげましょう

$.post("http://www.hackerschool.jp/hack/take19.php?id=1&id2=99", {input_id:"abcd", ymd:"年/月/日", pass:"juvgrunpxrem"}, function(data){window.open().document.write(data);});

または、htmlファイルを作り、中身を

    <html>
    <body>
    <form action="http://www.hackerschool.jp/hack/take19.php?id=1&id2=99" method="post">
    <input type="text" value="abcd" name="input_id">
    <input type="text" value="2016/10/01" name="ymd">
    <input type="text" value="juvgrunpxrem" name="pass">
    <input type="submit" value="go">
    </form>
    </body>
    </html>

としてもできる。(試してない。クリア画面に書いてあった)

take20

?file=main.txtとあります。main.txtを開いているようです。

で、よく見るとファイル名が index.pl になっています。
Perlを使用しているようです。
OSコマンドを注入できそうです。

(なぜか、それはperlでファイルを読み書きするときに使う open関数は パイプ付き文字列をOSコマンドとして実行するからだ。)

しかし、本当に実行できたら簡単にバックドアとか設置できてしまいますので、実行できるコマンドは限られているようです。
http://www.hackerschool.jp/hack/take20/index.pl?file=main.txt | ls
とすると......ありますね、なので
file=password.inc
してみます。

ニャー。
もうお分かりでしょう。





























#

わからなかった人のために。


ニャー。何の動物でしょう。

それは英語で何というでしょう。


linuxのコマンドにそのようなコマンドがないか調べてみましょう。

https://www.google.co.jp/#q=Linux+command+cat

次 -> shaige1120.hatenablog.com

前 -> shaige1120.hatenablog.com

8946 解説 1~10

1-10


とりあえず鳳凰問題を除いてのこり2問(Take24 Take32)なので、それ以外を解説していきます。
(ちなみに、Take32に関しては攻略方法はわかっていますが無線のせいか、試行錯誤するも、私の環境ではまったくできません)

以下、解説です。


Take1

説明するまでもないです。ソースにまんま書いてあります

Take2

fnFormSubmit関数のうえに、怪しいファイルが...

Take3

1のと同じ。
ただ暗号化されてるだけ。
復号化してくれるサイト探そう。
(ちなみに、末尾に=がついてるのは、Base64。ついてなくても、慣れればすぐBase64だと気づける

Take4

3と同じ。
ただ暗号の種類が違うだけ。
復号化してくれるサイト探そう。
(ちな、文字数が32文字なのはMD5)

といきたいところだが。
MD5は、一般には復号化できない(理論上)、ので辞書サイトを探しましょう。

Take5

SQLインジェクションですね。
IDを 「a' 1=1 --」
とかにしたらいけます。
退会してない人のでログインしましょう。

Take6

Basic認証ですね。通常Basicはhtpasswdなるファイルにパスワードの情報を記録するわけですが。 (htpasswdである必要はない) URLを ・・/take6/htpasswd.txtとするとすんなり中身がのぞけました。

Take7

ボタンをクリックしてもログインできませんね。
きっとIPアドレスか何かで判別しているのでしょうが、IPアドレスは簡単に変えられません。
まーこーゆーのは、きっとクッキーでしょう。
Firebugなどでクッキーみるとありますね、それっぽいのが。
1に書き換えてしまいましょう。

Take8

誤字なんか吹くw
計算です。

Take9

これも計算です。
answer変数を見ましょう。
まずこれは単項式です。なので(input_no % 2)が0だとほかがいかなる値でも0です。
なので、テキストボックスに入れる値は奇数です。なので
( ( seconds * ( seconds - 1 ) ) / 2 ) = 990 のような方程式を解きましょ。
手計算が早いでしょう。

Take10

SQLだべ。
んで、さっきのを入れてみると、文字化けしてる。。。
原因ですが、ブラウザの表示がUTF-8なのに出てきた文字はShift-JISなためです。

ソですね。

ソ' OR 1=1#
でしょう

次回は11から20です
次 -> 8946 解説 11~20 - 道民学生プログラマの憂鬱