[ACM] 3n+1

太久沒有寫code了 , 想說來寫寫練習一下 , 剛好看到有人的3n+1的code , 想說來寫個比較簡短的版本 , 直接recursive 下去做真的是方便時很多呢!

BTW , 我發現我真的很愛用三元運算子= =” , 清楚又短~


#include <stdio.h>
void cal(int,int);
int m_cal(int,int);
int main (int argc, const char * argv[]) {
int input1,input2;
while(scanf("%d%d",&input1,&input2)!=-1){
cal(input1,input2);
}
return 0;
}
int m_cal(int a,int length){
if(a==1){
return length;
}else if(a%2==1){
return m_cal(a*3+1,length+1);
}else{
return m_cal(a/2,length+1);
}
}
void cal(int a,int b){
int i=a>b?b:a,j=a>b?a:b;
int temp,memory=0;
for(i;i<=j;i++){
temp = m_cal(i,1);
memory = temp>memory ? temp:memory;
}
printf("%d %d %dn",a,b,memory);
}

[Hack] Directory Traversal

來講一下Directory Traversal , 會想講的原因是因為有意外看到相關的資訊是藉由 DT 而跑出來的..

Live Demo(index.php):

<?php
//初始化參數
if(!$path)
{
$path="test";
$xpath ="";
}

define("PATHFIELD",0);
define("FILEFIELD",1);
define("EXTFIELD",2);

$class="xxxxxx"; //類別,在每個目錄的class.conf.php中有紀錄,若無則保持空白
$filecount=0; //Count file(not directory) num
$dircount=0; //Count dir num

$dir=@opendir($path);

//讀取目錄資料並至於陣列當中
while($file=@readdir($dir))
{
if(is_dir("$path/$file"))
{
if($file=="."||$file=="..")
continue;
$examdir[$dircount++]="$file";
}
else if(is_file("$path/$file"))
{
if($file=="class.conf.php")
require("$path/$file"); //取得目錄提示資料
$exten=substr($file,-3,3); //Get file extention
if(!strcasecmp($exten,"pdf")||!strcasecmp($exten,"gif")||!strcasecmp($exten,"zip"))
{
$examfile["$filecount"][PATHFIELD]="$path/$file";
$examfile["$filecount"][FILEFIELD]="$file";
$examfile["$filecount"][EXTFIELD]="$exten";
$filecount++;
}
}
}

討論:

從最前面就可以看到 , Programmer 在設計這個頁面的時候 , 並沒有考慮到 DT 的問題 , 所以就沒有對一些具有攻擊性的字做filter or 白名單過濾 , 所以當 $path 來個 “../” 就掰囉~從父目錄一直到根目錄都一覽無遺…

Demo PHP Code 1(index.php):

<?php
readfile('/home/xx/file/'.$_GET['file']);
?>

Exploit:

http://target/index.php?file=../../etc/passwd

討論:

結果Unix Like的passwd的檔案就會被顯示出來 = =”…

Demo PHP Code 2(index.php):

<?php
readfile('/home/xx/file/'.$_GET['file'].'.dat');
?>

Exploit:

http://target/index.php?file=../../etc/passwd

討論:

利用 NULL character 來把後面的.dat給無用化 , 這樣就可以讀到passwd的內容了..

防範:

利用basename()把後面的東西做filter , 像是在$path那邊可以改成這樣 ,

$path = str_replace('.','',$path);
$true_path = "/www/".basename($path);

則所有的’.’都會被換成’ ‘,這樣就可以再依個人需求做變化 , 大致上應該是不會有太多問題了

[MAC] 建立工作環境

剛上網看了一下文章 , 發現 Leopard 10.5.6 有內建 apache 和 php , 整個就是超合我的工作環境的呀 , 就差要怎麼把他們給用出來啦

第一步要先來到這邊:

sudo vi /etc/apache2/httpd.conf

然後把PHP打開

LoadModule php_module

再來就Restart apache , 就可以寫PHP了!

再回到

/etc

把default的php.ini.default 複製一分出去 , 這樣舊的就可以當備分用

sudo cp php.ini.dafault php.ini

最後再打開網頁共享

系統偏好設定/共享/網頁共享

就可以用上面的路徑去讀我們的網頁啦~

BTW , 我們的網頁存放的資料夾是在

/Users/你的家目錄名稱/sites

[MAC] Macbook到手- 白狼

哈哈~ 我等這台等好久了= = 其實是在2009/03/03的時候買的,只是因為太累了所以我忘記打 , 就拖到這天再來補打一下我買MAC的事情啦!其實會買到這台也是很誇張 , 因為我那天中午跑去校園店找店長-Kimmy , 問他說我訂的那台有沒有來 , 而就在他打完電話去確認後 , 竟然發現可以立刻出一台給我= = , 所以就在下午1點多電腦就到了 … 有沒有這麼有效率 … 要賺錢也不是賺的這麼誇張阿 = = , 而我只好等到晚上再去拿電腦 , 因為課太多了!

到了晚上 , 就叫小夫陪我去拿那台電腦 , 結果誰知道因為我沒有超過20歲 , 所以要辦分期就要好多麻煩的手續= = , 我一直很怕我媽影印這麼多影本再傳真應該會發瘋然後罵我 orz , 不過還好他都沒有什麼大動作 , 反而很快的就幫我把需要的資料給弄到手了 XD , 寫完資料後就要打電話跟家人說等等電腦總公司會有人打電話去CHECK我的身份 , 因為要分期好像要做個簡單的身家調查 , 害我打給我哥提醒他的時候 , 他還在上課呢 , 真扯 , 不過還好之後大家都幫我Hold住了!! 更棒的是 , Kimmy 剛好幫我問到 , 有學生12期免息分期 , 整個就是超爽的阿!! 所以我就改選擇這個方案 , 以32900分12期的價格弄到手啦 , 喔耶:D~ 這樣我就有自己的筆電了!

BTW , 我的小白的綽號叫做白狼 而小夫的叫做銀狐 , 以後兩個人帶出去整個就超有FU的啦~ 酷炫!

[Research] Dartboard Statistics Method

我的我

共有16筆資料

2.2(-1.1)

4.1(+0.8)

3.5(+0.2)

4.5(+1.2)

3.4(+0.1)

1.6(-1.7)

3.1(-0.2)

3.2(-0.1)

3.2(-0.1)

3.7(+0.4)

3.0(-0.3)

2.6(-0.7)

3.8(+0.5)

3.1(-0.2)

4.7(+1.4)

3.7(+0.4)

平均≒3.3

說明:

圖上的每個間距是0.5(看統計者要統計到多詳細),而中間那條線代表平均值(在本例為3.343)而藍色部分代表的是大於平均值的資料,紅色部分代表的是小於平均值的資料,然後依照離均差的大小來決定資料點是落在哪個圓內,之後依照圓內點的數目比上所有點的數目求出分佈機率(ex:最小圓有10個點,全部有16個點,其分佈機率為62.5%)





如果我們以平面的角度來看的話,會發現他的分佈情況是呈現在一個呈現兩色的二維鏢靶上,可以很明顯的看出整體資料的離均情況。在這邊要特別討論一下這個圖的優點,因為我認為就算是一些不常出現的極值,還是整體資料的一部分,所以如果為了建出理論的完美模型而拾棄那些極值,反而是和現實生活不合的情況。因此我是以離均的大小來建構出這個圖,所以就算是少數極值也只會分配在最外圍的圓上,不會對整體架構產生太大的影響。





統計方法命名:

Dartboard Statistics Method – 鏢靶統計方法