viernes, 25 de febrero de 2011

ka0labs abre sus puertas de nuevo!

Bueno, pues deciros que ka0labs,antiguo ka0 team vuelve a abrir las puertas, contando con:

  • Blog.
  • Foro (Beta, programado desde cero totalmente por ellos).
  • Codeshare (sistema programado desde cero por ca0s y yo para postear códigos, con opción de hacer Grupos de desarrollo, mensajes privados, entre otras cosas).
Os esperamos por allí:


Saludos!

martes, 22 de febrero de 2011

Repaso a las estructuras de datos en C

Bien, las estructuras de datos son una aplicación muy interesante de la memoria dinámica.

Teniendo ya una base de estructuras, punteros y alguna idea sobre listas enlazadas explico un poco como van algunos tipos:


Listas enlazadas simples
Son listas en las que solo podemos avanzar hacia delante, puesto que manejamos un puntero "siguiente" para ir accediendo a cada elemento a partir del inicial. Por eso, tenemos que conservar el valor del puntero del primer elemento.


Listas doblemente enlazadas
Son listas iguales que las anteriores, pero además tenemos un puntero "anterior" apuntando al elemento anterior (lógicamente?). Gracias a esto podemos recorrerlas en los dos sentidos (del primero al último y del último al primero), pero como en las simples debemos conservar siempre el valor del puntero del primer elemento.


Listas circulares
Estas listas por así decirlo tienen "unidos" el primer y el último elemento, esto es, cuando acaba, el elemento siguiente al último no es NULL, es el primero otra vez.











Pilas
Estas estructuras son como la simulación de la stack (son estructuras LIFO, Last In First Out). Sobre ellas podemos hacer dos operaciones: push y pop. Con push añadimos un elemento al final de la pila, y con pop lo leemos al mismo tiempo que lo eliminamos.









Colas
Las colas son estructuras FIFO (First In First Out). Los elementos se añaden por un lado de la cola y se eliminan por el otro.















Y estas son las estructuras dinámicas más básicas en C.


Espero que sea útil para los iniciados!

bytez

lunes, 21 de febrero de 2011

Offset finder - Python version

Bah, para no estrañar a nadie son 4 lineas de código en Python las necesarías para lograr hacer lo mismo que el programa del compañero xassiz.

Como se puede esperar no tiene ningún tipo de manejo de errores ni nada, lo que hace el código es tirar de dos funciones de la API de Windows (conocida por e$to$ como SDK), que logran returnar el offset de una función dentro de una libreria.

El programa hace lo siguiente:
Coje un manejador para la libreria:
GetModuleHandleA(libreria)

Y la direción del proceso:

GetProcAddress(manejador, funcion)

Tenemos lo siguiente:
import sys
import ctypes
libreria = ctypes.windll.kernel32.GetModuleHandleA(sys.argv[1])
print sys.argv[2]+" en "+sys.argv[1]+" : "+str(ctypes.windll.kernel32.GetProcAddress(libreria, sys.argv[2]))

Esto ha sido todo, saludos

martes, 8 de febrero de 2011

3rd Security Blogger Summit - Ciberactivismo

Bueno, hablan del ciberactivismo y como afecta a la sociedad. Tenemos a Chema y a Rubén de ponentes!








Saludos!

sábado, 5 de febrero de 2011

[MASM] Busca offsets

Bueno, hace unos días empecé a aprender ASM y aquí está mi primera aplicacion (sintaxis MASM).

Lo que hace es buscar el offset de una función específica en una DLL. Solo hay que modificar "libreria" y "funcion" en .data.

;Busca offsets - by xassiz
.386
.model flat, stdcall
option casemap :none
 
include \masm32\include\masm32rt.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib
 
Main PROTO
 
.data
    libreria db "msvcrt.dll",0
    funcion db "printf",0
    error db "No se encontro el proceso.",0
 
.code
codigo:
    invoke Main
    invoke ExitProcess, 0
 
Main PROC
    LOCAL resultado:DWORD
 
    invoke LoadLibrary, addr libreria
    invoke GetProcAddress, eax, addr funcion
    mov resultado, eax
    cmp resultado, NULL
    je Error
    invoke StdOut, uhex$(resultado)
    ret
Error:
    invoke StdOut, addr error
    ret
Main ENDP
 
end codigo




Ahora versión para linea de comandos:
;Busca offsets cli - by xassiz
.386
.model flat, stdcall
option casemap :none

include \masm32\include\masm32rt.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib

.data
    error db "No se encontro la funcion.",0
.data?
    libreriaTMP dd ?
    libreria db 256 dup(?)
    funcionTMP dd ?
    funcion db 256 dup(?)
    argc dd ?


.code
codigo:
    invoke GetCommandLineW
    invoke CommandLineToArgvW, eax, addr argc
    or eax, eax
    cmp dword ptr argc, 3
    jb @f
    mov ebx, dword ptr[eax+4]
    mov dword ptr libreriaTMP, ebx
    mov ebx, dword ptr[eax+8]
    mov dword ptr funcionTMP, ebx
    invoke WideCharToMultiByte,CP_ACP,0,dword ptr libreriaTMP,-1,addr libreria,256d,0,0
    invoke WideCharToMultiByte,CP_ACP,0,dword ptr funcionTMP,-1,addr funcion,256d,0,0
    invoke LoadLibrary, addr libreria
    invoke GetProcAddress, eax, addr funcion
    or eax, eax
    je Error
    invoke StdOut, uhex$(eax)
    invoke ExitProcess, 0
Error:
    invoke StdOut, addr error
    @@: invoke ExitProcess, 0
end codigo


C:\Users\Pablo\Desktop>bOffsets msvcrt.dll system
7545B16F
C:\Users\Pablo\Desktop>bOffsets msvcrt.dll printf
7541C5B9
C:\Users\Pablo\Desktop>

Espero que os sirva xD

bytes!

viernes, 4 de febrero de 2011

DSA gag wikipedia

Hoy os presento una nueva forma de generación de llaves de DSA, este nuevo método inventado por la wikipedia y que claramente podeis ver aquí es el siguiente:



¿Con esto que demostramos? Los fantásticos, rigurosos y exhaustivos filtros a los cuales se somete la información en la wikipedia.

Saludos

jueves, 3 de febrero de 2011

De Sony a (in)Seguridad

Pues resulta que hoy, estaba estudiando ECDSA (Elliptic Curve Digital Signature Algorithm) que vendría a ser la versión usando curvas elípticas de DSA. Para quién no tenga ni puta idea de lo que estoy hablando ECDSA es un algoritmo que nos permite crear firmas digitales, esto es, podemos firmar archivos y mediante estas firmas comprobar su veracidad. No es plan tampoco de ponerme a hablar de ECDSA, así que vamos al meollo.

Resulta que tenemos como clave privada k, y un numero secreto m. Este número m es el usado en la generación de la firma que vendrían a ser los números r y s. ¿Cuál es el problema en el sistema de firmado de PS3?. Que m que debería ser un número generado aleatoriamente, lo que no se puede pedir es que Sony use un algoritmo criptograficamente seguro para la generación de números aleatorios, pero ya no es que no este presente un algoritmo criptograficamente seguro para la generación de números aleatorios es que no existe generación ninguna de números aleatorios. A continuación se presenta un ejemplo del código de generación de m:

#Aleatory number generator
def generatem():
    return 4

¿Que nos permite hacer el conocimiento de m? Pues sabiendo m podemos obtener k facilmente, y una vez obtenido k, que es la clave privada, sí como muchos de vosotros pensabais, podemos firmar. ¿Que significa esto?. Que ademas de poder darle por culo a Sony, podemos correr aplicaciones caseras (homebrew) y otro software no original si necisidad de recurir al jailbreak, o cosas por el estilo, ya que podremos firmar nuestras aplicaciones y estas pasaran de mil maravillas la verificación de la PS3.

¿Cúal es la moraleja? Que por qué seas una multinacional no debes descuidar tu seguridad, y mucho menos cometer un error de este calibre, Sony dio por supuesto que nadie lograría quebrantar su sistema, y cosas que pasan, casualidades de la vida, la seguiridad de su Sistema de Entretenimiento de Sobremesa hoy en dia es más que inexistente.

Por cierto quien guste de la criptografía le recomiendo la lectura de el boletín Enigma, que por cierto este mes tiene un artículo sobre el tema.

Aquí os dejo una conferencia que viene a hablar de esto mismo: