2011年5月30日 星期一

The End of Online Riddle

話說我又響果個討論區見到個Post講網頁解謎遊戲。

D網頁解謎遊戲成日都有 http://ozetta.net/aor/ 或者 http://riddle.arthurluk.net/ 做 Link 。同埋好多「靈感太多了」之類既字眼。
唔知點解 N 年前已經個個(?)都響度玩 Arthur's Online Riddle。後來我整左個 (唔係咩 AoR 私服版),不過冇人玩。完。


講返今日個題目。今日要講既係破解網頁解謎遊戲,除左上討論區搵 Walk-through 之外,其實有時可以直接問 Google。

例子:
咁你會搵到D類似 http://www.rrssriddle.com/beginner/stage3.html 既野。
當然咁樣搵未必可以即刻搵到終點,不過你都跳左好多關。


另一個方法係用字典攻擊。首先講下個軟件:
裝左之後就開佢啦。之後 Attack Setup 入面個 Url 打:
http://www.rrssriddle.com/beginner/FUZZ.html

個軟件會將 "FUZZ" 變左做字典入面既其中一個字。響網頁解謎入面亦即係答案。
字典邊度搵呢?雖然個軟件都包左好多字典,但係我會用「英文字典」,因為我成日覺得網頁解謎成日出生字。

英文字典:
我通常都用 2of4brif 。網頁解謎遊戲成日都要小寫冇標點符號,用呢本就 Good Fit。

Download 左本字典之後響 Dictionary 揀頭先果個 2of4brif.txt,之後就可以 Start。
至於 Thread 都係用返 5 好D。Set 太大炸到人地個 Server 出 503 俾你,仲可能會 skip 左D結果。

撞完之後可以 Export 返個 result,不過個 list 都唔代表係所有答案,因為假設左所有答案都係英文生字,其餘果D自己諗啦。


=====================
"好 Game" 推介:
http://ozetta.net/rory
打包下載:
http://ozetta.net/rory.zip

2011年5月21日 星期六

05212011

話咁快又世界末日
Have a nice day

2011年4月25日 星期一

Parallel universe

Why an event can happen many times concurrently?
Does parallel universe exist... ?

...
...
......






......









............

















...
















其實呢篇文同平行宇宙無關。純粹標題黨。

最近玩Facebook果隻癲佬王國,入面有樣技能可以每12個鐘Call一隻癲佬出黎,用5點MP,出完之後粒掣會灰左。12個鐘有排等,要諗下辦法Bypass佢。既然粒掣灰左,我就整到佢唔灰,再出多一次,佢又幾醒識 check 住你之前用過未,彈一句 "請求參數錯誤"。

我心諗呢度都幾難Bypass咁,之後無端端諗到N年前某遊戲既一個Bug,就係如果同時進行戰鬥換武器,有時會複製多把武器。
咁我就用個 Fiddler 係咁 replay 堆 requests,之後同一時間 release 晒佢。結果係Call左7隻癲佬,同埋唔知點解剩係用左5點MP。
後來隻Game有個活動,參加左會多6個item,一日最多參加一次。我又出同一招,結果我由23個item變左做115個。最奇怪係唔知點解 115-23 唔係6既倍數。


Why flooding will work like this?
其實係因為個 server 根本唔可能同時處理晒咁多個 request 。睇下下面個例子(php):

<?php
error_reporting(0);

$fr = fopen('request.txt', 'a');
fwrite($fr,date("Y-m-d H:i:s")."\r\n");
fclose($fr);


$fo = fopen('counter_outer.txt', 'r');
$co = intval(fgets($fo));
echo("Outer: ".$co);
fclose($fo);

$fo = fopen('counter_outer.txt', 'w');
fwrite($fo,++$co);
echo("->".$co."<br />");
fclose($fo);


$fb = fopen('counter_barrier.txt', 'r');
$cb = intval(fgets($fb));
echo("Barrier: ".$cb);
fclose($fb);

if($cb<10){

$fb = fopen('counter_barrier.txt', 'w');
fwrite($fb,++$cb);
echo("->".$cb."<br />");
fclose($fb);


$fi = fopen('counter_inner.txt', 'r');
$ci = intval(fgets($fi));
echo("Inner: ".$ci);
fclose($fi);

$fi = fopen('counter_inner.txt', 'w');
fwrite($fi,++$ci);
echo("->".$ci."<br />");
fclose($fi);
}
echo('<br />End');
?>


上面段野都係求奇寫,入面有3個計數器,outer 係數總共收到幾多 request,barrier 係數總共有幾多個 request 過到個 if statement, inner 係數總共有幾多個 request 響個 if statement 入面 run 到。

如果你拍實 F5,個走勢會係咁:


Outer: 0->1
Barrier: 0->1
Inner: 0->1
...
Outer: 9->10
Barrier: 9->10
Inner: 9->10

Outer: 10->11
Barrier: 10
...
Outer: 29->30
Barrier: 10

開返 counter_inner.txt 睇,個 inner 都係 10
好自然去到 10 應該會截停晒 if statement 入面堆野,outer 就自己繼續加。

但係如果我響 if($cb<10){ 上面加句 sleep(1); 叫佢訓一秒,情況就唔同晒:


Outer: 0->1
Barrier: 0->1
Inner: 0->1
...
Outer: 40->41
Barrier: 2->3
Inner: 40->41


好不幸地 Barrier 個 counter 係咁用返舊果個數,搞到 Inner 果度可以 Run 多好多次。

個 sleep 放響邊都會影響個結果,呢樣野你地自己試下。