summaryrefslogtreecommitdiff
path: root/trafgen_lexer.l
diff options
context:
space:
mode:
Diffstat (limited to 'trafgen_lexer.l')
-rw-r--r--trafgen_lexer.l152
1 files changed, 152 insertions, 0 deletions
diff --git a/trafgen_lexer.l b/trafgen_lexer.l
new file mode 100644
index 0000000..69caa58
--- /dev/null
+++ b/trafgen_lexer.l
@@ -0,0 +1,152 @@
+/*
+ * netsniff-ng - the packet sniffing beast
+ * By Daniel Borkmann <daniel@netsniff-ng.org>
+ * Copyright 2012 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
+ * Swiss federal institute of technology (ETH Zurich)
+ * Subject to the GPL, version 2.
+ */
+
+/* lex-func-prefix: yy */
+
+%{
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "trafgen_parser.tab.h"
+#include "xmalloc.h"
+
+extern void yyerror(const char *);
+
+static char *try_convert_shellcode(char *sstr)
+{
+ int j = 0;
+ char *bstr, *ostr = sstr, *hay;
+ size_t blen, slen = strlen(sstr), tot = 0;
+ const char *needle = "\\x";
+
+ sstr++;
+ slen -= 2;
+
+ if (slen % 4 != 0)
+ return sstr;
+
+ blen = slen / 4;
+ hay = sstr;
+ while ((hay = strstr(hay, needle)) != NULL ) {
+ hay += strlen(needle) + 2;
+ tot++;
+ }
+
+ if (blen != tot) {
+ printf("Warning: mixed shellcode with strings, "
+ "using strings!\n");
+ return sstr;
+ }
+
+ blen += 2;
+ bstr = xzmalloc(blen);
+
+ bstr[j++] = '\"';
+ while (j < blen - 1)
+ bstr[j++] = (uint8_t) strtoul(sstr + 2, &sstr, 16);
+ bstr[j++] = '\"';
+
+ xfree(ostr);
+ return bstr;
+}
+
+%}
+
+%option align
+%option nounput
+%option noyywrap
+%option noreject
+%option 8bit
+%option caseless
+%option noinput
+%option nodefault
+
+number_oct ([0][0-9]+)
+number_hex ([0][x][a-fA-F0-9]+)
+number_bin ([0][b][0-1]+)
+number_dec (([0])|([-+]?[1-9][0-9]*))
+number_ascii ([a-zA-Z])
+
+%%
+
+"cpu" { return K_CPU; }
+"fill" { return K_FILL; }
+"rnd" { return K_RND; }
+"csumip" { return K_CSUMIP; }
+"csumip4" { return K_CSUMIP; }
+"csumudp" { return K_CSUMUDP; }
+"csumtcp" { return K_CSUMTCP; }
+"drnd" { return K_DRND; }
+"dinc" { return K_DINC; }
+"ddec" { return K_DDEC; }
+"seqinc" { return K_SEQINC; }
+"seqdec" { return K_SEQDEC; }
+"const8"|"c8" { return K_CONST8; }
+"const16"|"c16" { return K_CONST16; }
+"const32"|"c32" { return K_CONST32; }
+"const64"|"c64" { return K_CONST64; }
+
+[ ]*"-"[ ]* { return '-'; }
+[ ]*"+"[ ]* { return '+'; }
+[ ]*"*"[ ]* { return '*'; }
+[ ]*"/"[ ]* { return '/'; }
+[ ]*"%"[ ]* { return '%'; }
+[ ]*"&"[ ]* { return '&'; }
+[ ]*"|"[ ]* { return '|'; }
+[ ]*"<"[ ]* { return '<'; }
+[ ]*">"[ ]* { return '>'; }
+[ ]*"^"[ ]* { return '^'; }
+"{" { return '{'; }
+"}" { return '}'; }
+"(" { return '('; }
+")" { return ')'; }
+"[" { return '['; }
+"]" { return ']'; }
+"," { return ','; }
+":" { return ':'; }
+
+"\n" { yylineno++; }
+
+"\""[^\"]+"\"" { yylval.str = try_convert_shellcode(xstrdup(yytext));
+ return string; }
+
+([ \t\r\n]+)? { return K_WHITE; }
+
+"/*"([^\*]|\*[^/])*"*/" { return K_COMMENT; }
+
+"#"[^\n]* { return K_COMMENT; }
+
+{number_hex} { yylval.number = strtoul(yytext, NULL, 16);
+ return number; }
+
+{number_dec} { yylval.number = strtol(yytext, NULL, 10);
+ return number; }
+
+{number_oct} { yylval.number = strtol(yytext + 1, NULL, 8);
+ return number; }
+
+{number_bin} { yylval.number = strtol(yytext + 2, NULL, 2);
+ return number; }
+
+{number_ascii} { yylval.number = (uint8_t) (*yytext);
+ return number; }
+
+"'\\x"[a-fA-F0-9]{2}"'" { yylval.number = strtol(yytext + 3, NULL, 16);
+ return number; }
+
+"'"."'" { yylval.number = (uint8_t) (*(yytext + 1));
+ return number; }
+
+";"[^\n]* {/* NOP */}
+. { printf("Unknown character '%s'", yytext);
+ yyerror("lex Unknown character"); }
+
+%%