Tod ist unvermeidlich, aber meist unbedeutend...

viernes, 5 de abril de 2013

"Ich Bin L0ki" ASM GNU/Linux

;HOLA MUNDO ASM LINUX
;L0ki
section .data
    msg    db "Ich Bin L0ki",0x0A
    size   equ $ - msg

section .text      ;Instrucciones
   global _start 

_start:
    mov edx,size  ;Cargamos el tamanio de la cadena
    mov ecx,msg   ;Cargamos el mensaje
    mov eax,0x04  ;Salida por pantalla
    mov ebx,0x01  ;cargamos a 1 como argumento de la salida por pantalla
    int 0x80      ;Llamada al kernel
    mov eax,0x01  ;Para salir, funcions sys_exit() del kernel
    mov ebx,0x00  ;Codigo de salida 0
    int 0x80      ;Llamada al kernel
Lo único que hace este simple programa es mostrar en pantalla el mensaje "Ich bin L0ki". Simple programa demostrativo de la programación en lenguaje ensamblador en GNU/Linux.

domingo, 31 de marzo de 2013

Caracter + Valor decimal + Valor hexadecimal | C | Ncurses

Programa que muestra a partir de un caracter ingresado, su valor en hexadecimal y su valor en Decimal. Programado usando la librería "Ncurses" y C.

#include < ncurses.h >
//@Null_L0ki
//zerozecurity.blogspot.com 
int main(){
    initscr();
    //noecho();
    keypad(stdscr,true);
    int i,a,b;
    getmaxyx(stdscr,a,b);
    raw();
    move(0,0);
    printw("Escribe un caracter ([ESC] para salir):\n> ");
    int c;
    while((c=getch())!=27){
        for(i=0;i < a;i++){
            mvprintw(3,i,"=");
        }
        for(i=0;i < a;i++){
            mvprintw(7,i,"=");
        }
        mvprintw(4,1,"Valor decimal    : %d\n",c);
        mvprintw(5,1,"Valor Hexadecimal: 0x%x\n",c);
        mvprintw(6,1,"Simbolo          : %c\n",c);
        move(0,0);
        printw("Escribe un caracter ([ESC] para salir):\n> ");
        refresh();
    }
    endwin();
    return 0;    
}

Una captura:
L0ki!

martes, 26 de marzo de 2013

Factorial de N recursivo | Python

El factorial de un numero usando recursividad.

#@GraggLoki
def factorial(n):
    if(n==0):
        return 1;
    return (factorial(n-1)*n)
n=input("Factorial de: ")
print "El resultado es: "+str(factorial(n))

lunes, 25 de marzo de 2013

HALLO | HOLA | HELLO

#Loki
GetAccess="0x00"
def NoLookHere():
    return (91 > int(GetAccess,16))
GetSystemShell_LinuxOS=NoLookHere()

GetSystemShell='0b1000001'
def IsCorrect_():
    if(GetSystemShell_LinuxOS==True):
        return GetSystemShell
        
x0ddF97=(1 < 10)        
_0100H=chr(int("0x48",16)) 
x96="0x"
def ____0x0A(FFFF):
    if(FFFF):
        return _0100H
x103=""

import math
x103 = x103 +____0x0A(x0ddF97)
x000 = x103
x000 = x000 +chr(int(hex(int(math.sqrt(6241))),16))
NULL=x000+chr(int("0x4C",16))

print NULL+chr(int(IsCorrect_(),2))
#define __0x90__ int
#define _ return
#define __NULL__ putchar
__0x90__ STACK(){_ 0x47;}
#define NOP "#define"
__0x90__ POP(){_ 0x4e;}
#define __________ for
#define __0x01__ __0x90__
#include < stdio.h >
__0x01__ PUSH(){_ 0x4b
;}char While (__0x90__ x);
#if __0x90__
    #define  hex STACK()
#else
    #undef __0x01
#endif
__0x01__ LDDR(){_ 0x40;
}
__0x90__ * Switch(){ __0x90__ a[]={STACK(),POP(),PUSH(),LDDR()};_ a;}
#define __B__ For
__0x90__ main( void ){
#define LOAD _
__0x90__ * a =Switch(), i;__________ (i = (0x00-1)+0x01 ;i <  (0x0A-6);i++){ While (a[i]+1)
;}_ 0;}char While ( __0x90__ x) {LOAD  __NULL__ (x);}
#define _INCLUDE_STDIO EXIT_SUCCESS

#define __________ main
#define _0x00_ printf
#define Main putchar
int
__________
(int a,
char *
While
)
{
    int _0x0A,_LOAD_= 0b00000000,A=7;a=64+A
    ;for(
         _0x0A  =   -1  ;_0x0A    <
         0x01;
    ++
            _0x0A){
    While[
        _0x0A
                        ]=
   (        putchar ( (
               a+1
               )
    +_LOAD_));
    _LOAD_+=
    A;
        }
                        int i=0; A=0x4B;
    do{
putchar( A
               +1);
            i++; A= -    0x0A;
    }while(i=!
                                2);
    Main    (   0x36
            +0b1011);
    return

                    (0b00000);
}

sábado, 23 de marzo de 2013

Instalación del Simulador del Microprocesador Z80 en GNU/Linux

Esta vez vamos a instalar el simulador del microprocesador Z80 en GNU/Linux, para esto vamos a descargar el siguiente archivo:
wget http://wwwhomes.uni-bielefeld.de/achim/z80-asm/z80-asm-current.tar.gz


o también desde aquí
Y lo descomprimimos con:
tar -xzvf z80-asm-current.tar.gz
Una vez hecho esto nos dirigimos a la carpeta descomprimida y instalamos el programa con:
sudo make
Y despues:
sudo make install
Y veremos algo como esto:

Es puramente normal.
Una vez hecho esto vamos a crear un programa para verificar el funcionamiento, el programa es el siguiente:
MAIN:
    LD A,05
    LD B,0x0A
    ADD A,B
    LD (0050H),A
    HALT 

Ahora con el siguiente comando creamos la salida para que el simulador pueda usarla
z80-asm prueba.asm output

Y ahora con el comando
z80-mon
abrimos el simulador.
Cargamos el programa, pulsamos la tecla "L" asi en mayuscula y nos aparecera "Load File: " y escribimos "output", prodremos observar como se cargo el programa:

Pulsamos la tecla "r" minúscula y el programa se ejecutara hasta la instrucción HALT, y ahora nos moveremos a la direccion 0050 para ver el resultado, esto lo hacemos pulsando la tecla "m" minúscula y escribimos 0050H. Ahora podemos ver que en esa localidad de memoria tenemos un
 "0f" esto es un 15 en decimal. Por lo que nuestro programa funciona correctamente!


Loki!

martes, 19 de marzo de 2013

Navegar de forma anónima en la red [ Tor | Polipo | Proxychains ]


Hola que tal, en esta ocasión vamos a hacer uso de un par de herramientas... TOR y POLIPO
Estas dos herramientas nos ayudarán para navegar anónimamente en la red, y bien con TOR (ya muy conocido) obtenemos una dirección IP (Tor is a network of anonymising TCP proxies) diferente pero con POLIPO evitamos que envíe las solicitudes de DNS por fuera de la red Tor, con lo que hacemos nuestro "anonimato" mas "fuerte".

Proxychains es un programa disponible solamente para GNU/Linux y Unix que nos permite crear cadenas de proxies, “ocultando” así nuestra IP pública real en todo tipo de conexiones (HTTP, FTP, SSH, etc…). Esto se traduce en que podemos navegar por Internet o realizar cualquier operación en la red de redes sin descubrir nuestra identidad real. (Info obtenida de acá )

Antes que nada todos los pasos realizados se estan haciendo desde una computadora con Debian 6.0.6, las instalaciones en otros Sistemas GNU/Linux son parecidas o aveces hasta iguales. También necesitamos tener instaladas dichas herramientas.

[*] Instalación y configuración de Proxychains
Para ello vamos a ir a la Terminal e instalarlo con:
sudo aptitude install proxychains

Ahora bien vamos a configurarlo, abrimos un editor de textos el fichero /etc/proxychains.conf, nos vamos hasta la parte mas baja del archivo y tenemos que configurarlo de la siguiente manera:
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks4  127.0.0.1 9050
Esto para que se conecte con TOR, bien tenemos configurado Proxychains


[*] Instalación y configuración de POLIPO
Ahora instalaremos polipo con:
sudo aptitude install polipo

Una vez hecho esto vámos a configurarlo, para ello tenemos que editar el archivo de configuración que esta en /etc/polipo/config y dejarlo de la siguiente manera:

### Basic configuration
### *******************

# Uncomment one of these if you want to allow remote clients to
# connect:

# proxyAddress = "::0"        # both IPv4 and IPv6
# proxyAddress = "0.0.0.0"    # IPv4 only

proxyAddress = "127.0.0.1"
proxyPort = 8118

# If you do that, you'll want to restrict the set of hosts allowed to
# connect:

# allowedClients = "127.0.0.1, 134.157.168.57"
# allowedClients = "127.0.0.1, 134.157.168.0/24"

allowedClients = 127.0.0.1
allowedPorts = 1-65535

# Uncomment this if you want your Polipo to identify itself by
# something else than the host name:

proxyName = "localhost"

# Uncomment this if there's only one user using this instance of Polipo:

cacheIsShared = false

# Uncomment this if you want to use a parent proxy:

# parentProxy = "squid.example.org:3128"

# Uncomment this if you want to use a parent SOCKS proxy:

socksParentProxy = "localhost:9050"
socksProxyType = socks5


### Memory
### ******

# Uncomment this if you want Polipo to use a ridiculously small amount
# of memory (a hundred C-64 worth or so):

# chunkHighMark = 819200
# objectHighMark = 128

# Uncomment this if you've got plenty of memory:

# chunkHighMark = 50331648
# objectHighMark = 16384

chunkHighMark = 67108864

### On-disk data
### ************

# Uncomment this if you want to disable the on-disk cache:

diskCacheRoot = ""

# Uncomment this if you want to put the on-disk cache in a
# non-standard location:

# diskCacheRoot = "~/.polipo-cache/"

# Uncomment this if you want to disable the local web server:

localDocumentRoot = ""

# Uncomment this if you want to enable the pages under /polipo/index?
# and /polipo/servers?.  This is a serious privacy leak if your proxy
# is shared.

# disableIndexing = false
# disableServersList = false

disableLocalInterface = true
disableConfiguration = true

### Domain Name System
### ******************

# Uncomment this if you want to contact IPv4 hosts only (and make DNS
# queries somewhat faster):
#
# dnsQueryIPv6 = no

# Uncomment this if you want Polipo to prefer IPv4 to IPv6 for
# double-stack hosts:
#
# dnsQueryIPv6 = reluctantly

# Uncomment this to disable Polipo's DNS resolver and use the system's
# default resolver instead.  If you do that, Polipo will freeze during
# every DNS query:

dnsUseGethostbyname = yes


### HTTP
### ****

# Uncomment this if you want to enable detection of proxy loops.
# This will cause your hostname (or whatever you put into proxyName
# above) to be included in every request:

disableVia = true

# Uncomment this if you want to slightly reduce the amount of
# information that you leak about yourself:

# censoredHeaders = from, accept-language
# censorReferer = maybe

censoredHeaders = from,accept-language,x-pad,link
censorReferer = maybe

# Uncomment this if you're paranoid.  This will break a lot of sites,
# though:

# censoredHeaders = set-cookie, cookie, cookie2, from, accept-language
# censorReferer = true

# Uncomment this if you want to use Poor Man's Multiplexing; increase
# the sizes if you're on a fast line.  They should each amount to a few
# seconds' worth of transfer; if pmmSize is small, you'll want
# pmmFirstSize to be larger.

# Note that PMM is somewhat unreliable.

# pmmFirstSize = 16384
# pmmSize = 8192

# Uncomment this if your user-agent does something reasonable with
# Warning headers (most don't):

# relaxTransparency = maybe

# Uncomment this if you never want to revalidate instances for which
# data is available (this is not a good idea):

# relaxTransparency = yes

# Uncomment this if you have no network:

# proxyOffline = yes

# Uncomment this if you want to avoid revalidating instances with a
# Vary header (this is not a good idea):

# mindlesslyCacheVary = true

# Suggestions from Incognito configuration
maxConnectionAge = 5m
maxConnectionRequests = 120
serverMaxSlots = 8
serverSlots = 2
tunnelAllowedPorts = 1-65535

Una vez hecho esto procedemos a guardar el archivo de configuración. Recuerden hacer esto como SUPER USUARO. 
Terminamos la instalación y configuración, si desean descargar el archivo de configuración lo pueden hacer desde acá: https://www.dropbox.com/s/stblfax8tqtqv95/config
o con el comando:
wget https://www.dropbox.com/s/stblfax8tqtqv95/config

[*] Instalación y configuración de TOR
Las herramientas anteriores estan configuradas para el uso de TOR, asi que manos a la obra.
Instalamos tor con el comando:
sudo aptitude install tor tor-geoipdb
Y Finalmente corremos el servicio de TOR:
sudo /etc/init.d/tor start

Y finalizamos nuestra instalación de las herramientas. Ahora lo mas importante, el uso de ellas.
Para probar nuestra configuración necesitamos ver nuestra IP real y la IP que nos proporciona nuestro servicio que contratamos.

[*] Probando nuestra configuración
Un comando muy útil para saber nuestra IP pública desde la terminal es:
curl ifconfig.me
Esto nos devuelve nuestra IP Pública, algo como:


El funcionamiento que actualmente tenemos o como configuramos nuestras herramientas es el siguiente:

PROGRAMA ----> POLIPO ----> TOR

Esto es un programa se conectara con Polipo pero este este configurado para que funcione con TOR, recuerden que con POLIPO evitamos que envíe las solicitudes de DNS por fuera de la red Tor.

Así que podemos conectarnos desde algún software (sqlmap , firefox, w3m, etc) y hacer uso de TOR+POLIPO para navegar de forma anónima.
Con Proxychains lo que hacemos es usar un proxy previamente ya configurado, para entender su uso vamos a teclear el mismo comando curl pero usando proxychains...
Algo como:
proxychains curl ifconfig.me
Y veremos como nuestra IP cambia, esto por que se conecto desde TOR


Ahora se preguntaran como se si en verdad POLIPO esta haciendo su trabajo, con ayuda de una herramienta mas Etherape, la podemos instalar (OPCIONAL) con el comando:
sudo aptitude install etherape
Con esta herramienta podremos visualizar de manera gráfica lo que pasa en la red, por ejemplo cuando nos conectamos de manera directa a internet esto pasa:

Se hace la consulta DNS (azul) y después se conecta (verde).
Cuando hacemos uso de Polipo y Tor esto vemos:

No se hace la consulta DNS, si no se conecta directamente al servidor...

Configuramos nuestro navegador para que haga uso de TOR:
Cuando hacemos uso únicamente TOR  se hacen las consultas DNS (Azul) y después entra a TOR...

 Podemos ver el .de (servidores de Alemania) que son los que esta usando TOR.
Y jueguen con las herramientas... pueden usarlas con nmap, sqlmap, etc... esto nos hace ser "mas" anónimos...
Happy Hacking!
Loki!

Recursividad

Hola que tal, en esta ocasión vamos a hablar de la Recursión. La Recursión es como un circulo sin fin, un claro ejemplo de esto es la siguiente imagen:


Anuncio de cacao con una imagen recursiva. La mujer muestra un paquete idéntico al del propio anuncio, conteniendo así a otra mujer que muestra otro paquete más pequeño, de forma recursiva. (Tomado de Wikipedia)
Con la programación podemos hacer lo mismo, por ejemplo si queremos calcular el factorial de un número lo podemos hacer de forma recursiva. Tal vez sea un poco confuso si es la primera vez que escuchan hablar de este termino, pero es muy sencillo.

Vamos a hacer un programa el cuál use funciones que se llamen a si mismas. ¿Es esto posible? Si en efecto es posible. Pero, ¿El programa no terminará nunca? En efecto, seria un ciclo sin fin, pero para ello usaremos en base a un razonamiento cual será la condición para la cuál se deje de hacer la llamada a si mismo.

Y creo que esto no quedará claro hasta que se pueda visualizar en un ejemplo, por ejemplo queremos realizar la suma para n=5
Esto es: 1+2+3+4+5=15

Veamos el razonamiento:
sumaRecursiva(1)=1
sumaRecursiva(2)=sumaRecursiva(1)+2 = 3
sumaRecursiva(3)=sumaRecursiva(2)+3 = 3 + 3 = 6
sumaRecursiva(4)=sumaRecursiva(3)+4 = 6 + 4 = 10
sumaRecursiva(5)=sumaRecursiva(4)+5 = 10 + 5 = 15
.....
.....
.....
De forma general sería:
sumaRecursiva(n) = sumaRecursiva(n-1)+n ----> Para n>1
Si n=1 ---> sumaRecursiva(1)=1

Si lo programamos de forma iterativa sería algo como:
public int sumaIterativa(int m){
    int n=0,i;
    for(i=1;i<=m;i++)
        n+=i;
    return n;
}
Pero si lo hacemos de forma recursiva sería algo como:

public int sumaRecursiva(int n){
    if(n==1)
        return 1;
    return sumaRecursiva(n-1)+n;
}

Lenguaje empleado: Java. Ambos códigos realizan lo mismo pero están programados de formas diferentes, el primero es simple usando un ciclo for se realiza la sumas hasta que se alcance al valor deseado, en la segunda forma se llama a si mismo, y dejará de llamarse hasta que el valor de n sea igual a 1. Esta es la condición para que la recursividad se rompa.

Un ejemplo de la serie de Fibonacci usando recursividad en Lenguaje Python:
def fibonacci(n):
    if((n==1) or (n==2)):
        return 1
    else:
        return (fibonacci(n-1)+fibonacci(n-2))
n=int(input("Numero: "))
print ("Resultado: %d"%fibonacci(n))

Eso es todo, un Saludo.
Loki!

Multiplicación en ASM Z-80

Usando el Microprocesador Z80 programé el siguiente código, cuyo fin es la multiplicación de dos números previamente cargados en memoria, por ejemplo en la localidad 1000H cargamos un 5 y en la localidad 1001H cargamos un 10, y el resultado de la multiplicación lo cargamos en la localidad 1002H.
;Multiplicacion en ASM
;Usando el microprocesador Z80
;@GraggLoki
MAIN: 
    LD A,(1000H) ; A <- (1000H)
    CP 0         ; Comparacion con cero
    JR Z,ETI5    ; Si la bandera Z esta encendida vamos a ETI5
    LD B,A       ; Cargamos a B con el contenido de A
    LD A,(1001H) ; Cargamos a A con el contenido de la dir 1001H
    CP 0        
    JR Z,ETI5    
    CP B         
    JP P,ETI2
    LD C,A
    LD A,0
ETI3:
    ADD A,B
    DEC C       ; C=C-1
    JR NZ,ETI3
ETI5:
    LD (1002H),A
    HALT
ETI2:
    LD C,A
    LD A,0
ETI4:
    ADD A,C
    DEC B
    JR NZ,ETI4
    JR ETI5

Aquí podemos ver que, después de haberse ejecutado el programa, en la localidad 1002H tenemos como resultado un 32 en hexadecimal, que en decimal es 50.
3 * 16 = 48 + 2 = 50



Loki!

domingo, 17 de marzo de 2013

Factorial de un número en Python

El factorial de un número en Python, usando sumas iterativas:

#!/usr/bin/env python
#Factorial de un numero usando sumas iterativas
#@GraggLoki

def mult(a,b):
    cont=0
    suma=0
    while(cont < b):
        suma=suma+a
        cont=cont+1
    return suma
    
n=input("Numero: ")
if(n < 0):
    print ("No existe factorial de "+str(n))
else:
    if(n==0):
        m=1
    else:
        m=n #m es una copia del numero a calcular
        i=m-1
        while(i!=0):
            m=mult(m,i)
            i=i-1
    print ("El resultado es %d" % m)

Loki!