コードを短くするのって楽しいですよね?(14)

PKU OnlineJudgeのセキュリティホールはどこにあったのか?


対策がされたので、もうここで書いてもいいだろう。このセキュリティホールをいかにして発見して、いかにしてそれを利用したのかを書いてもいいころあいだ。


まず、他人のソースコードをincludeしてしまえれば一番短くなる。


#include"someone/anwser.c"

他人のソースコードがどこにあるのかを知るためには、まずは自分のソースコードがどこに存在するのかを知らなければならない。自分のソースコードのファイル名は、__FILEで与えられるので、__FILEの文字列を一文字ずつ確定させていく。(id:yaneurao:20051129やid:yaneurao:20051130の方法で。あの説明ではWA(Wrong Answer)とacceptとの二種類で判定するように書いているが、実際はacceptされた回数は増やしたくないので、*(int*)0=0;などとしてRE(Runtime Error)をわざと引き起こすと良い。すなわち、REとWAとで判定していく。)


結果、C言語ならばMain.c、C++言語ならばMain.cppというようなファイル名であることがわかった。だけど大切なのはそこではない。そのpathが問題なのだ。pathにはRunID(uniqueでincrementalなID)が含まれている。そこで、自分でcommitしたソースの所在が確定するので、自分でcommitしておいてそれをincludeしようとした。


ところが、判定が行なわれてるとそのフォルダはまるごと削除される。また、判定はひとりずつ行なわれ、二人同時に行なわれることは無い。よって、IDを二つ取得して、片方のIDで正解のソースをcommitし、その判定が行なわれるまでの時間に別のIDからそのソースをincludeするという荒業も使えない。(つづく)