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ú

Mensajes - Sagrini

#1
Nunca es tan sencillo. Voy a mirar a ver cómo se hacen las claves privadas... ya verás tú
#2
Lo estuve pensando el otro día... y no le encuentro ninguna pega al método que describes. La idea sería generar claves privadas como loco (el código estará por ahí, no es muy complicado), y obtener las direcciones BitCoin (igual, la cosa es encontrar el código, y como todo es open-source...). Comprobar si alguna dirección tiene saldo (se puede hacer conectándose a varios servidores a la vez, blockchain.info es uno, habrá más)... y esperar. Supongo que habrá miles de millones de claves posibles, y que el proceso de sacar las direcciones públicas y ver su saldo no va a ser muy rápido... pero con que encuentres una ya puedes celebrarlo. ¿A qué está ahora, a 400$? ¿700$? Con un poco de suerte y desarrollando un código en condiciones...
La única pega es que parece demasiado fácil! Y da igual que el usuario cifre sus claves privadas... no tiene nada que ver. Tú vas sacando claves privadas, da igual que ya las tenga otro! No sé... ¿dónde está el problema?
PD: Digo yo que se podría montar una red de ordenadores chiquitillos haciendo eso, no? Con fines educativos, digo... ;D Al taller de criptografía asimétrica hay que empezar a sacarle provecho ^.^
#3
Que sepas que, llevando 2 años justos sin entrar en el foro, no he podido evitar entrar al ver este post jajajaj. A mí también me comió un poco la cabeza... pero te explico lo mejor que pueda.
Lo que estás buscando con este código es sobreescribir la dirección de retorno de una función que... no tienes. A ver, que me lío. Creo que el problema es cómo lo estás enfocando. Para hacer lo que tú quieres hacer, lo que yo he hecho toda la vida ha sido sobreescribir la dirección de retorno a main () de una función llamada desde main ()... un código como:

#include <stdio.h>

void welldone ()
{ printf ("Campeon!!\n"); return; }

int yo (char *entrada)
{ char buffer [48]; strcpy (buffer, entrada); return 0;
}

int main (int argc, char *argv [])
{ yo (argv [1]); return 0; }

Main llama a yo () y le pasa el 1º argumento. Entonces yo () lo copia a un buffer con un tamaño limitado con la función strcpy () (había otra por ahí mejor que strcpy () por este tema, porque te limitaba el tamaño de las cadenas y evitaba estos problemas, pero no recuerdo cómo se llamaba...) y vuelve a main (). Ahí está la clave. Lo primero que yo hacía era sustituir la dirección de retorno a main () por la dirección de welldone (), y luego me las ingeniaba para meter de por medio la shellcode...
Espero que se entienda. Si puedo, subiré un ejemplo en un ratillo... Y el lunes subo el tutorial que dejé a medias (¿¿¿¿con 13 años????) sobre esto. No sé si realmente main () tiene ninguna dirección de retorno que sustituir! Habría que verlo... pero creo que no. Al menos no lo recuerdo así. Voy a por ese ejemplo. A ver si te vale ;)
Sagrini

Lo que te vendría muy muy bien sería echarle un vistazo (estudiártelo ENTERITO, es perfecto) a un libro que se llama "Hacking. Técnicas fundamentales" de Jon Erickson. En cualquier biblioteca estará. Te va a servir muchísimo.

_______________________________________
MODIFICO:
Aquí lo tienes. Es un post antiguo, ya me sonaba a mí de algo el problema.
http://foro.elhacker.net/bugs_y_exploits/first_bof_linux_attack_sagrini_2010_elhackernet_funciona-t317514.0.html;msg1578503#msg1578503
En ese link tienes la respuesta completa con el ejemplo para lo de llevar el flujo de la ejecución a una función que no se invoca... y en la página siguiente el ejemplo con shellcode ;)
#4
Atracción de dos masas :P
#5
No es posible hacerlo directamente, ya que una shellcode no puede contener bytes nulos (y el binario tiene muchísimos). La idea es escribir en ensamblador una a una todas las líneas que ejecutan la shellcode.
#6
Todo lo que han comentado mis compañeros es correcto, pero ninguno ha prestado atención al gran error de ese código.
if((n%")==0)
What? A qué viene esa comilla? No sé ni como te compila :/


#include <stdio.h>

int main ()
{ int num; scanf ("%d", &num);
if (num%2==0) printf ("El numero es par\n");
else printf ("El numero es impar\n");
return 0;
}

Primero, el warning es porque no hay ningún return. Eso es importante. Luego, usas %f cuando "num" es un entero. Y luego, no hace falta calcular dos veces, un solo "else" vale.
MODF: Nueva respuesta. Eso es porque %f es para variables definidas como FLOAT. Tú defines el número como ENTERO (int). De todos modos, el error importante es el que te he señalado arriba. ¡Y deja de usar conio.h y getch ()! Cuando llegue a la universidad (dentro de unos cuantos años jajaj) le voy a pegar un repaso a alguno por este tema ¬¬
#7
Tratas número como si fuese un int, cuando en realidad es un char * (o como decís en C++, "string" xD). Busca algo sobre la función atoi () e implementa una.
#8
Programación C/C++ / Re: Programacion c++
6 Abril 2012, 23:29 PM
Y qué tal si tratáis el número como una cadena?

#include <stdio.h>
#include <math.h>

int Atoi (char car)
{ switch (car)
{ case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3;
case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7;
case '8': return 8; case '9': return 9; default : return -1;
}
}

int main (int argc, char *argv [])
{ if (argc != 2) { printf ("Use: code <num>\n"); return 1; }
int resultado=0, a;
for (a=0; a<strlen (argv [1]); a++) resultado+=pow (Atoi (argv [1][a]), strlen (argv [1])-a);
printf ("%d\n", resultado); return 0;
}
#9
Puedes sencillamente hacer un socket () y luego leer directamente con read () o recv (). Recv () no da problemas si el socket no está inicializado, no tienes que buscar otra solución.
#10
Programación C/C++ / Re: Duda tabla [5][5]
4 Abril 2012, 15:13 PM
Responderé tu problema directamente:

#include <stdio.h>

int main ()
{
int tabla[5][5]; int a, b, c=0; // DECLARACION VARIABLES
for (a=0; a<5; a++) for (b=0; b<5; b++) {  c++; tabla [a][b]=c; } // INICIALIZAMOS (ME DA PEREZA HACERLO A TU MODO :P)
for (a=0; a<5; a++) { for (b=0; b<5; b++) { printf ("%d ", tabla [a][b]); } printf ("\n"); } // ESCRIBIMOS
return 0;
}