1. 程式人生 > >ctf練習

ctf練習

也是剛接觸ctf不久,在做題的過程中,也是學到了不少東西。
剛開始是從南郵的題目入手的,不過再做過bugku上面的題之後,覺得這上面的更適合新手入門。
題的難度與易到難,每道題所需要的知識點也非常清晰。
前幾天在做 字元?正則?這道題時,對正則略有心得,就想寫篇文章,發表一下拙見。
畢竟是新手,又是第一次寫文章,若是有出錯的地方,還請大家多包涵,多指教。

對於正則表示式,只要我們能把這個表示式看懂,能夠很好的理解它所要表達的內容,然後輸入符合要求的字串就行了。
那麼,對於新手來說,怎麼才能看懂這讓人頭疼的正則表示式呢。
這裡網上有一個很詳細的教程,大家可以看一下,我也是看完之後,才瞭解正則表示式的
https://www.cnblogs.com/superstar/p/6638970.html

下面,來看下bugku上面這道關於正則的題,原始碼如下:
<?php
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>

程式碼裡,重要的就是這一句了:$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match)
這句話的大致意思就是我們要傳入一個id引數,並且它要符合這個正則表示式:"/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i"
下面,讓我們一起來分析一下這個表示式:
1.“key”是表示式直接寫出來的字串,直接利用即可 //?id=key
2.“.”代表任意字元 //這裡我們用a來充當任意字元 ?id=keya
3.“*”匹配前面的表示式零次或多次,此時“*”前面是“key.”而“.”是字元,所以就是匹配key零次或多次 //這裡我們匹配零次 //?id=keya
4.“key”是表示式直接寫出來的字串,我們直接利用 //?id=keyakey
5.“.”接下來又是點,我們還用a來充當 //?id=keyakeya
6.“{4,7}”的意思就是匹配前面的字元4-7次,結合前面的“.”,就是匹配任意字元4-7次 //?id=keyakeyaaaa
7.“key”是表示式直接寫出來的字串,我們直接利用 //?id=keyakeyaaaakey
8.“:”也是表示式直接寫出來的字串,我們直接利用 //?id=keyakeyaaaakey:
9.“\/”代表“/” //?id=keyakeyaaaakey:/
10.“.”這個點我們還用a來充當 //?id=keyakeyaaaakey:/a
11.“\/”代表“/” //?id=keyakeyaaaakey:/a/
12.“(.*key)”這裡我們輸入key就行 //?id=keyakeyaaaakey:/a/key
13.[a-z]代表a-z中的任意一個字元,這裡我們繼續用a //?id=keyakeyaaaakey:/a/keya
14.[[:punct:]]代表任意一個字元,包括各種符號,輸入標點符號即可,這裡我們用個分號 //?id=keyakeyaaaakey:/a/keya;
15./i代表大小寫不敏感

到此,我們就寫出了一個符合要求的表示式,傳入id引數就得到了flag。