有限状态自动机FA

懒人在思考?WAF研究中...

有限状态自动机(Finate Automaton)是假想机器,用来判断字符串是否匹配正则表达式。

FA:{Σ,S,T}
  • Σ:字母表{a,b}
  • S:状态集合{S1,S2,S3,S4}
  • T:转换表

当FA处于某个状态时,若读入一个字母表中的字符,那么将查找转换表,转换到另一个状态。

b1f8de8f2357d6bb179b2cf8f27517c3.png
  • 圆圈表示:状态
  • 线和线上字符表示:转换表

174223b19f7b154c7a7e36f1803db5c4.png

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ailx10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值