【问题标题】:Snort/PCRE Regex: odd character class syntaxSnort/PCRE 正则表达式:奇数字符类语法
【发布时间】:2013-12-31 01:13:30
【问题描述】:

在解析 Snort 正则表达式集时,我发现了一个非常奇怪的字符类语法,例如 [\x80-t][\x01-t\x0B\x0C\x0E-t\x80-t],我无法弄清楚(真的不知道)什么 -t 的意思。我什至不知道它是标准 PCRE 还是某种 Snort 扩展。

下面是一些包含这些字符类的正则表达式:

/\x3d\x00\x12\x00..........(.[\x80-t]|...[\x80-t])/smiR
/^To\x3A[^\r\n]+[\x01-t\x0B\x0C\x0E-t\x80-t]/smi

PS:请注意,\x80-t 甚至不是标准方式中的有效范围,因为字符 t\x74

【问题讨论】:

  • @polkadotcadaver 当然。我正在调查一些项目,一个是netbench。它包含几个来自 L7、Bro 和 Snort 的正则表达式,位于 pattern_match/rules 目录下。其中一些字符类在 Snort/voip.rules.pcre 中,另一些在 Snort/exploit.rules.pcre 中。
  • 来自的代码是否编译?
  • 另外,您是否复制/粘贴了正则表达式? (只是为了确保它是t 而不是τ 或其他看起来接近t 的字母)
  • @Hamza 我还查看了 pcre 手册,我也想到了一个错误。但是有两个以上的正则表达式,发现这么多类似的错误很奇怪。关于编码/字符表我一无所获,但这并不意味着它不可能。
  • @AngeloNeuschitzer 我已经从上述文件中复制/粘贴了正则表达式。

标签: regex pcre snort


【解决方案1】:

这可能引用了不同的字符编码,其中t 大于x80 并且x80 无法正常寻址。

以EBCDIC扫码为例(见here for a reference)。

(但我也不知道为什么有人要这样写)

对于 ASCII,我有一个大胆的猜测:如果 -t 表示“直到下一个标记 -1”,或者如果放在最后一行“直到允许的字符结束”,第二个查询将说明:

To:(not a newline, more than one character)(not a newline)

所以基本上[\x01-t\x0B\x0C\x0E-t\x80-t] 表示[^\r\n]

如果将其应用于(.Ç-t]|...[Ç-t]),它将处理大于 7 位 ASCII 的任何字符,也可以处理所有 unicode(除了前 127 个字符)。

(话虽如此,我仍然不知道为什么有人要这样写,但至少除了“这是一个错误”之外,这是一个连贯的解释)

也许有帮助:如果您写出 \xYY,您发布的 reexes 是什么意思? ASCII:

/=\NULL\DEVICE_CONTROL_2\NULL\.{10}\(.Ç-t]|...[Ç-t])/smiR
/^To\:[^\r\n]+[\START_OF_HEADING-t\VERTICALTAB\FORMFEED\SHIFTOUT\Ç-t]/smi

照顾\0x12 aka Device control 2 可能会有所帮助,因为它不会出现在文本中,但可能会出现在网络流量中。

【讨论】:

  • 这是一个有趣的观点,但在这种情况下,我无法理解类[\x01-t\x0B\x0C\x0E-t\x80-t] 会有重叠的范围。
  • @Simone-Cu 你能发布一些使用该正则表达式的代码吗? - 此外,重叠范围可能不是“好”但它们应该工作,因此它可能对观察者没有“意义”,这可以由一位干预他的正则表达式“直到它们工作”但不检查的作者来解释他们之后彻底。
  • 这是真的,但真的很奇怪。关于代码,这些正则表达式应该来自 Snort 正则表达式集(如果 netbench 团队没有错误地收集它们,请参阅我在 netbench 问题中的第一条评论之一)。到目前为止,我正在尝试将其转换为 java regex 并转换为解析树以用于其他目的,所以我会说 regex 是数据。
  • 你发现了一个奇怪的神器,毫无疑问。我不知道 netbench,但如果它可以“运行”,您是否尝试运行它并触发该表达式?我的意思是,它应该坏掉,也许它会坏掉?
  • 这是一个很好的建议。我肯定会朝这个方向进行调查。
【解决方案2】:

第二个正则表达式匹配以To:(不区分大小写)开头的行,后跟至少一个不是换行符或回车符的字符。由于这是一个贪婪匹配,我希望\r\n[\x01-t\x0B\x0C\x0E-t\x80-t] 字符类中唯一可能的终止匹配。注意:\r 等价于\x0D\n 等价于\x0A。不确定-t 是什么意思,但我们假设它是-。那么字符类将是[\x01-\x0B\x0C\x0E-\x80-],这仍然有点令人费解,但会更有意义 - 即允许\n作为终止字符但不允许\r

这是一个非常的远景,但有没有可能是某种搜索和替换出错了?! (如果有其他正则表达式在没有t 的情况下具有正常范围,猜猜这可能很快就会被打折。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2022-01-10
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多