2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2012 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
5 * Swiss federal institute of technology (ETH Zurich)
6 * Subject to the GPL, version 2.
9 /* lex-func-prefix: yy */
19 #include "trafgen_parser.tab.h"
23 extern void yyerror(const char *);
25 static char *try_convert_shellcode(char *sstr)
27 bool found_any = false;
28 char *bstr, *ostr = sstr, *hay, *orig = sstr;
29 size_t j = 0, blen, slen = strlen(sstr), tot = 0;
30 const char *needle = "\\x";
40 while ((hay = strstr(hay, needle)) != NULL ) {
41 hay += strlen(needle) + 2;
46 if (blen != tot || !found_any)
50 bstr = xzmalloc(blen);
54 bstr[j++] = (uint8_t) strtoul(sstr + 2, &sstr, 16);
72 number_oct ([0][0-9]+)
73 number_hex ([0]?[x][a-fA-F0-9]+)
74 number_bin ([0]?[b][0-1]+)
75 number_dec (([0])|([1-9][0-9]*))
76 number_ascii ([a-zA-Z])
80 "cpu" { return K_CPU; }
81 "fill" { return K_FILL; }
82 "rnd" { return K_RND; }
83 "csum16" { return K_CSUMIP; }
84 "csumip" { return K_CSUMIP; }
85 "csumip4" { return K_CSUMIP; }
86 "csumicmp" { return K_CSUMIP; }
87 "csumicmp4" { return K_CSUMIP; }
88 "csumudp" { return K_CSUMUDP; }
89 "csumtcp" { return K_CSUMTCP; }
90 "drnd" { return K_DRND; }
91 "dinc" { return K_DINC; }
92 "ddec" { return K_DDEC; }
93 "seqinc" { return K_SEQINC; }
94 "seqdec" { return K_SEQDEC; }
95 "const8"|"c8" { return K_CONST8; }
96 "const16"|"c16" { return K_CONST16; }
97 "const32"|"c32" { return K_CONST32; }
98 "const64"|"c64" { return K_CONST64; }
100 [ ]*"-"[ ]* { return '-'; }
101 [ ]*"+"[ ]* { return '+'; }
102 [ ]*"*"[ ]* { return '*'; }
103 [ ]*"/"[ ]* { return '/'; }
104 [ ]*"%"[ ]* { return '%'; }
105 [ ]*"&"[ ]* { return '&'; }
106 [ ]*"|"[ ]* { return '|'; }
107 [ ]*"<"[ ]* { return '<'; }
108 [ ]*">"[ ]* { return '>'; }
109 [ ]*"^"[ ]* { return '^'; }
121 "\""[^\"]+"\"" { yylval.str = try_convert_shellcode(xstrdup(yytext));
124 ([ \t\n]+)? { return K_WHITE; }
126 "/*"([^\*]|\*[^/])*"*/" { return K_COMMENT; }
128 "#"[^\n]* { return K_COMMENT; }
130 {number_hex} { yylval.number = strtoul(yytext + (yytext[0] == 'x' ? 1 : 0),
134 {number_dec} { yylval.number = strtol(yytext, NULL, 10);
137 {number_oct} { yylval.number = strtol(yytext + 1, NULL, 8);
140 {number_bin} { yylval.number = strtol(yytext + (yytext[0] == 'b' ? 1 : 2),
144 {number_ascii} { yylval.number = (uint8_t) (*yytext);
147 "'\\x"[a-fA-F0-9]{2}"'" { yylval.number = strtol(yytext + 3, NULL, 16);
150 "'"."'" { yylval.number = (uint8_t) (*(yytext + 1));
153 ";"[^\n]* {/* NOP */}
154 . { printf("Unknown character '%s'", yytext);
155 yyerror("lex Unknown character"); }