Snort/PCRE Regex: синтаксис нечетного символьного класса
Пока я разбирал набор регулярных выражений 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.
Ответы
Ответ 1
Это может ссылаться на другую кодировку символов, где t
больше, чем x80
и x80
не может быть рассмотрено нормально.
Возьмите коды кода EBCDIC, например (см. здесь для справки).
(Но я тоже не знаю, почему кто-то захочет написать его таким образом)
Для 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, который также может адресовать весь юникод (помимо первых 127 символов).
(При этом я до сих пор не знаю, почему кто-то должен писать это так, но, по крайней мере, это объяснение, помимо "Его ошибка" )
Может быть, полезно: что означают ваши рексиксы, если вы выписываете \xYY?
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
, может помочь, потому что это не будет отображаться в тексте, но, возможно, в сетевом трафике.
Ответ 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
.)