elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Ayuda con combinaciones y cantidades
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con combinaciones y cantidades  (Leído 3,435 veces)
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Ayuda con combinaciones y cantidades
« en: 24 Enero 2016, 23:03 pm »

Hola, estaba buscando información por internet sin mucho éxito sobre como calcular la cantidad de combinaciones posibles entre objetos, el tema es que ya conozco sobre permutaciones pero no es exactamente lo que busco.

Lo que he leido son formulas para encontrar la cantidad de combinaciones de una cantidad exacta de objetos con repetición entre ellas, el problema es el siguiente:

Tengo un generador de diccionario palabras, pero este incluye el carácter inicial sin longitud exacta, por ejemplo:

Digamos que tengo 26 carácteres (las letras del abecedario), cuales son las posibles combinaciones en 2 carácteres?, algunos dirán 26*26, pues no es así porque 26^2=676 pero en realidad son 702... porque?

aaa
aab
aac
aad
aae
...

Ese tipo de combinaciones son factibles, pero en mi caso no es asi:

a
b
c
...
z
aa
ab
ac
ad

Entonces incluye el evelado a la cantidad mas el primero que no se contabilizó, o sea ((26*26)+26)

Ahora si tenemos 3 carácteres deberíamos decir así: 26*26*26, pero en ves de eso es (26*26*26)+(26*26)+26=18278

Ahora, si lo hacemos con 4 carácteres algunos dirán 26*26*26*26, pero no es así tampoco, realmente es
(26*26*26*26)+(26*26*26)+(26*26)+26=475254

Ahora, a alguien se le ocurre como automatizar esto?, actualmente tengo la cantidad de carácteres y la longitud máxima de la palabra, digamos que la cantidad de carácteres son 26 y la longitud máxima son 4, el resultado debería darme 475254, pero como lo hago? existe alguna formula que no conozca aun y que sea conocida para estas situaciones?


En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Ayuda con combinaciones y cantidades
« Respuesta #1 en: 24 Enero 2016, 23:21 pm »

Ya me di cuenta, son "variaciones", ahora tocará ver como automatizar esto en python xD


En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Ayuda con combinaciones y cantidades
« Respuesta #2 en: 24 Enero 2016, 23:41 pm »

Finalmente lo hice con un bluce que suma cada elevado

Código:
self.total_of_words = 0
for n in range(0, self.user_max_longitude):
    self.total_of_words = self.total_of_words + self.calculateTotal(n + 1)

...
    def calculateTotal(self, longitude):
        return len(self.list_string)**longitude

En otras palabras tengo una función que calcula el elevado de n:

Código:
funcion calculaTotal( numero )
    retorna total_caracteres^numero

Después llamo a la función con un loop, la cantidad de vueltas es igual a la cantidad de carácteres que quiero generar y voy sumando el resultado en una variable, asi se va autoincrementando:

Código:
total = 0
loop 1 hasta longitud
    total = total + calculaTotal ( cantidad del loop )

De esta manera cumplo si la longitud es x entonces se eleva x veces elevado por x - la cantidad de la vuelta, o sea:

si la longitud es 10 entonces:
26^1 + 26^2 + 26^3 + 26^4 + 26^5 + 26^6 + 26^7 + 26^8 + 26^9 + 26^10

:D y me ha resultado muy bien, ahora voy a ver como calcular la cantidad de carácteres totales xD para estimar el peso del archivo del diccionario mas 1 (\n) por cada palabra.

Código:
whk@machine:~/$ python make_dict.py
- Dictionary Maker 1.0 by WHK for pentesting purposes.
- Enter max longitude of word [4]        :
- Use letters?                [Y/n]      :
- Use lowercase?              [Y/n]      :
- Use uppercase?              [y/N]      : n
- Use numbers?                [Y/n]      : n
- Use special chars?          [y/N]      : n
- Filename of dictionary      [dict.txt] :
- The file exists.You want to replace it? [y/N] : y
                                                       
  Summary                                             
  -----------------------------------------------------
- Max longitude of word                  : 4
- Total number of characters to use      : 26
- Total of words                         : 475254
- Use letters                            : Yes
- Use lowercase letters                  : Yes
- Use uppercase letters                  : No
- Use numbers                            : No
- Use special chars                      : No
- Filename of dictionary                 : dict.txt (override)
  -----------------------------------------------------
- You want to proceed?        [Y/n]      :
- End!
whk@machine:~/$
« Última modificación: 24 Enero 2016, 23:43 pm por WHK » En línea

El Benjo


Desconectado Desconectado

Mensajes: 392



Ver Perfil WWW
Re: Ayuda con combinaciones y cantidades
« Respuesta #3 en: 24 Enero 2016, 23:44 pm »

Según entiendo tú mismo ya tienes la fórmula para calcular eso.

Suponiendo que la cantidad de caracteres es la variable 'c' y la longitud máxima es 'l', entonces las combinaciones posibles 'p' sería:

p = (cl + cl-1 + cl-2 ... cl-(l-1)) + c

Y eso lo puedes simplificar mediante el símbolo de sumatoria. Lo cual no puedo hacerlo aquí porque no sé como escribirlo. XD

Y el código en python sería algo como:

Código
  1. longitud = 4
  2. c = 26
  3. p = 0
  4. for l in range(longitud + 1):
  5.    if l != 0:
  6.        p += c**l
  7. print(p)

EDITADO: Bueno, ya lo habías resuelto. XD
« Última modificación: 24 Enero 2016, 23:46 pm por El Benjo » En línea

www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Ayuda con combinaciones y cantidades
« Respuesta #4 en: 24 Enero 2016, 23:45 pm »

Gracias, tambien llegue a la misma conclusión, supongo que es la mas facil, saludos.
En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.606


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: Ayuda con combinaciones y cantidades
« Respuesta #5 en: 25 Enero 2016, 00:22 am »

Bueno, ya lo terminé, si alguien lo quiere aca está:
https://github.com/WHK102/whk-dictionary-maker/blob/master/whk-dict-maker.py

Ahora con esto podré crear facilmente diccionarios para hacer bruteforce a los servidores DNS y sacar subdominios ocultos.

Código:
whk@machine:~/$ python whk-dict-maker.py 
- WHK Dictionary Maker 1.0, for pentesting purposes.
- Enter max longitude of word [4]        :
- Use letters?                [Y/n]      :
- Use lowercase?              [Y/n]      :
- Use uppercase?              [y/N]      :
- Use numbers?                [Y/n]      :
- Use special chars?          [y/N]      :
- Filename of dictionary      [dict.txt] :

  Summary                                              
  -----------------------------------------------------
- Max longitude of word                  : 4
- Total number of characters to use      : 36
- Total of words                         : 1,727,604
- Use letters                            : Yes
- Use lowercase letters                  : Yes
- Use uppercase letters                  : No
- Use numbers                            : Yes
- Use special chars                      : No
- Filename of dictionary                 : dict.txt
- File size estimated of dictionary      : 8.19MB
  -----------------------------------------------------
- You want to proceed?        [Y/n]      :
- End!                                                

whk@machine:~/$ ls -lah
total 8,3M
drwxrwxr-x 3 whk whk 4,0K ene 24 20:24 .
drwxrwxr-x 4 whk whk 4,0K ene 24 20:09 ..
-rw-rw-r-- 1 whk whk 8,2M ene 24 20:24 dict.txt
-rw-rw-r-- 1 whk whk 7,0K ene 24 20:09 whk-dict-maker.py
whk@machine:~/$

El código por si se cae o desaparece el repositorio:

Código
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import sys
  5. import os
  6. import math
  7.  
  8. class MainCLS:
  9.  
  10.    total_of_words      = 0
  11.    total_of_characters = 0
  12.    current             = 0
  13.    user_longitude      = 0
  14.    user_use_letters    = False
  15.    user_use_lowercase  = False
  16.    user_use_uppercase  = False
  17.    user_use_numbers    = False
  18.    user_use_specials   = False
  19.    user_filename       = ''
  20.    list_string         = ''
  21.  
  22.  
  23.    def processWord(self, str):
  24.        self.current = self.current + 1
  25.        self.file_handler.write("%s\n" % str)
  26.        sys.stdout.write("\r- Progress: %d/%d (%s)                " % (self.current, self.total_of_words, str))
  27.        sys.stdout.flush()
  28.  
  29.  
  30.    def loop(self, prefix, loops):
  31.        if loops == 0:
  32.            return
  33.  
  34.        last_list = []
  35.        for id_letter in range(0, len(self.list_string)):
  36.            final_str = prefix + self.list_string[id_letter]
  37.            last_list.append(final_str)
  38.            self.processWord(final_str)
  39.  
  40.        for id_array in range(0, len(last_list)):
  41.            self.loop(last_list[id_array], loops - 1)
  42.  
  43.  
  44.    def getInput(self, message, type_inp, default_value):
  45.        inp = raw_input(message)
  46.        inp = inp.strip()
  47.  
  48.        if inp == '':
  49.            inp = default_value
  50.  
  51.        if type_inp == 'int':
  52.            try:
  53.                val = int(inp)
  54.                if val > -1:
  55.                    return val
  56.                else:
  57.                    print '- That\'s not an number. Try again.'
  58.                    return self.getInput(message, type_inp, default_value)
  59.  
  60.            except ValueError:
  61.                print '- That\'s not an number. Try again.'
  62.                return self.getInput(message, type_inp, default_value)
  63.  
  64.        elif type_inp == 'bool':
  65.            if inp.lower() == 'y':
  66.                return True
  67.            elif inp.lower() == 'n':
  68.                return False
  69.            else:
  70.                print '- Please, respond with yes (y) or not (n). Try again.'
  71.                return self.getInput(message, type_inp, default_value)
  72.  
  73.        elif type_inp == 'file':
  74.            if os.path.isfile(inp):
  75.                respond = self.getInput('- The file exists.You want to replace it? [y/N] : ', 'bool', 'n')
  76.                if respond == False:
  77.                    return self.getInput(message, type_inp, default_value)
  78.                else:
  79.                    return inp
  80.            else:
  81.                return inp
  82.  
  83.        else:
  84.            return inp
  85.  
  86.    def printSummary(self):
  87.        print '                                                       '
  88.        print '  Summary                                              '
  89.        print '  -----------------------------------------------------'
  90.        print '- Max longitude of word                  : ' + '{0:,}'.format(self.user_max_longitude)
  91.        print '- Total number of characters to use      : ' + '{0:,}'.format(len(self.list_string))
  92.        print '- Total of words                         : ' + '{0:,}'.format(self.total_of_words)
  93.  
  94.        if self.user_use_letters == True:
  95.            print '- Use letters                            : Yes'
  96.            print '- Use lowercase letters                  : ' + ('Yes' if self.user_use_lowercase  else 'No')
  97.            print '- Use uppercase letters                  : ' + ('Yes' if self.user_use_uppercase  else 'No')
  98.        else:
  99.            print '- Use letters                            : No'
  100.  
  101.  
  102.        print '- Use numbers                            : ' + ('Yes' if self.user_use_numbers  else 'No')
  103.        print '- Use special chars                      : ' + ('Yes' if self.user_use_specials else 'No')
  104.        if os.path.isfile(self.user_filename):
  105.            print '- Filename of dictionary                 : ' + self.user_filename + ' (override)'
  106.        else:
  107.            print '- Filename of dictionary                 : ' + self.user_filename
  108.  
  109.        print '- File size estimated of dictionary      : ' + self.convertSize(self.total_of_characters)
  110.  
  111.        print '  -----------------------------------------------------'
  112.        return self.getInput('- You want to proceed?        [Y/n]      : ', 'bool', 'y')
  113.  
  114.  
  115.    def convertSize(self, size, precision=2):
  116.        # size = size + 0.0
  117.        suffixes=['B','KB','MB','GB','TB','PB']
  118.        suffixIndex = 0
  119.        while size > 1024 and suffixIndex < 4:
  120.            suffixIndex += 1 #increment the index of the suffix
  121.            size = size/1024.0 #apply the division
  122.        return ("%.*f%s" % (precision, size, suffixes[suffixIndex]))
  123.  
  124.  
  125.    def __init__(self):
  126.  
  127.        print '- WHK Dictionary Maker 1.0, for pentesting purposes.';
  128.        # self.user_min_longitude = self.getInput('- Enter min longitude of word [0]        : ', 'int',  '0')
  129.        self.user_max_longitude = self.getInput('- Enter max longitude of word [4]        : ', 'int',  '4')
  130.  
  131.        self.user_use_letters   = self.getInput('- Use letters?                [Y/n]      : ', 'bool', 'y')
  132.        if self.user_use_letters == True:
  133.            self.user_use_lowercase   = self.getInput('- Use lowercase?              [Y/n]      : ', 'bool', 'y')
  134.            self.user_use_uppercase   = self.getInput('- Use uppercase?              [y/N]      : ', 'bool', 'n')
  135.  
  136.        self.user_use_numbers   = self.getInput('- Use numbers?                [Y/n]      : ', 'bool', 'y')
  137.        self.user_use_specials  = self.getInput('- Use special chars?          [y/N]      : ', 'bool', 'n')
  138.        self.user_filename      = self.getInput('- Filename of dictionary      [dict.txt] : ', 'file', 'dict.txt')
  139.  
  140.        self.list_string = ''
  141.  
  142.        if self.user_use_letters == True:
  143.  
  144.            if self.user_use_lowercase == True:
  145.                self.list_string = self.list_string + 'abcdefghijklmnopqrstuvwxyz'
  146.  
  147.            if self.user_use_uppercase == True:
  148.                self.list_string = self.list_string + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  149.  
  150.        if self.user_use_numbers == True:
  151.            self.list_string = self.list_string + '0123456789'
  152.  
  153.        if self.user_use_specials == True:
  154.            self.list_string = self.list_string + '\\/\'"@#$%&/()=?¿!¡+-*_.:,;'
  155.  
  156.  
  157.        self.total_of_words      = 0
  158.        self.total_of_characters = 0
  159.        for n in range(0, self.user_max_longitude):
  160.            total = (len(self.list_string)**(n + 1))
  161.            self.total_of_words      = self.total_of_words + total
  162.            # (word length * count words) + \n
  163.            self.total_of_characters = self.total_of_characters + (total * (n + 1)) + total
  164.  
  165.        # Summary
  166.        response = self.printSummary()
  167.        if response == False:
  168.            return
  169.  
  170.        # Load file
  171.        if os.path.isfile(self.user_filename):
  172.            os.remove(self.user_filename)
  173.        self.file_handler = open(self.user_filename, 'w')
  174.  
  175.        # Execute all
  176.        self.loop('', self.user_max_longitude)
  177.  
  178.        # End
  179.        self.file_handler.close()
  180.        print "\r                                                       \r- End!"
  181.  
  182. if __name__ == '__main__':
  183.    mainCLS = MainCLS()
  184.  
« Última modificación: 25 Enero 2016, 00:30 am por WHK » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines