懶人在思考?WAF研究中...
有限狀態自動機(Finate Automaton)是假想機器,用來判斷字元串是否匹配正則表達式。
FA:{Σ,S,T}
當FA處於某個狀態時,若讀入一個字母表中的字元,那麼將查找轉換表,轉換到另一個狀態。
S1是入口,看看自動機能表示哪些字元串?
abbb abbababab aaababab bababab aaa bbb
可以看出此自動機和正則表達式[ab]+是等價的!
[ab]+
數學證明任何一個正則表達式都有一個等價的FA! 任何一個FA也有一個等價的正則表達式!
我們要整一個FA來代替正則表達式:
新建h-d.l文件,用?替換數字,其他原樣輸出,內容如下:
%% [0-9]+ printf("?"); # return 0; . ECHO; %%
int main(int argc, char* argv[]) { yylex(); return 0; }
int yywrap() { return 1; }
生成C代碼,編譯運行:
root@ubuntu:/home/flex# flex h-d.l root@ubuntu:/home/flex# ls h-d.l lex.yy.c root@ubuntu:/home/flex# gcc lex.yy.c root@ubuntu:/home/flex# ./a.out hackbiji2018 hackbiji? . . # root@ubuntu:/home/flex#
效果:
[0-9]+
#
.
注意優先順序先後順序,在前的優先順序高,是不是很強大!這一切都歸功於flex將正則表達式轉換成自動機FA ~
flex
參考文獻:自己動手寫編譯器(pandolia.net/tinyc/)
推薦閱讀: