懒人在思考?WAF研究中...
有限状态自动机(Finate Automaton)是假想机器,用来判断字符串是否匹配正则表达式。
FA:{Σ,S,T}
- Σ:字母表{a,b}
- S:状态集合{S1,S2,S3,S4}
- T:转换表
当FA处于某个状态时,若读入一个字母表中的字符,那么将查找转换表,转换到另一个状态。
- 圆圈表示:状态
- 线和线上字符表示:转换表
S1是入口,看看自动机能表示哪些字符串?
abbb
abbababab
aaababab
bababab
aaa
bbb
可以看出此自动机和正则表达式[ab]+
是等价的!
数学证明任何一个正则表达式都有一个等价的FA! 任何一个FA也有一个等价的正则表达式!
我们要整一个FA来代替正则表达式:
- 一来可以构建语义引擎,(开源XSS语义引擎核心技术:FA)
- 二来可以为机器学习提特征,(优化掉提特征需要用到的正则表达式)
flex词法分析
新建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 ~
参考文献:自己动手写编译器(pandolia.net/tinyc/)