echo.c
Home
Projects
 0xC0D3
arpgen.c
arpgenclient.c
arpgenserver.c
echospoof.c
headers.c
asmwrite.s
asmhello.s

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void gravedigger(void);
void copystr(int, char *);
int main(int argc, char **argv)
{
	int lsd, csd, clen;
	struct sockaddr_in *lsock, *csock;
	char cread[1024];
	int sockopt = 1;
	int portnum;
	pid_t forkpid;

	if (argc != 2) {
		fprintf(stderr, "argv[1] == port number.");
		exit(1);
	}
	
	portnum = atoi(argv[1]);

	signal(SIGCHLD, gravedigger);

	lsock = (struct sockaddr_in *) malloc(sizeof(struct sockaddr_in));
	csock = (struct sockaddr_in *) malloc(sizeof(struct sockaddr_in));

	if ((lsd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		perror("socket");
		exit(1);
	}

	if (setsockopt(lsd, SOL_SOCKET, SO_REUSEADDR, (char *)&sockopt, sizeof(sockopt)) < 0) {
		perror("setsockopt");
		exit(1);
	}

	bzero(lsock, sizeof(struct sockaddr_in));
	bzero(csock, sizeof(struct sockaddr_in));

	lsock->sin_family = AF_INET;
	lsock->sin_port = htons(portnum);
	lsock->sin_addr.s_addr = htonl(INADDR_ANY);

	if (bind(lsd, lsock, sizeof(struct sockaddr_in)) < 0) {
		perror("bind");
		exit(1);
	}

	if (listen(lsd, 2) < 0) {
		perror("listen");
		exit(1);
	}

	while ((csd = accept(lsd, csock, &clen)) > 0) {
		forkpid = fork();
		if (forkpid < 0) {
			perror("accept");
			abort();
		} else if (forkpid > 0) {
			continue;
		} else {
			memset(cread, '\0', sizeof(cread));
			while (read(csd, cread, sizeof(cread)) > 0) {
				copystr(csd, cread);
				memset(cread, '\0', sizeof(cread));
			}
			shutdown(csd, 2);
			exit(0);	
		}
	}

	shutdown(csd, 2);
	return 0;
}

void copystr(int csd, char *readin)
{
	char overflow[80];

	memset(overflow, '\0', sizeof(overflow));
	printf("readin: %s", readin);
	strcpy(overflow, readin);
	write(csd, overflow, strlen(overflow));
	printf("overflow: %s", overflow);
}

void gravedigger(void)
{
	fprintf(stderr, "SIGCHLD caught.\n");
	wait();
}