懒人在思考?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/)
推荐阅读: