Jump to content
spcl

repetição um pouco estranha

Recommended Posts

spcl

boa noite,

estou a fazer um script de brute-force pois sou novato e queria fazer algo que nesta linguagem para mim fosse um desafio, o objetivo deste script é eu dar uma string e ele fazer o brute force ate chegar a ela

De momento apenas estou a dar os códigos dos caracteres em ascii para pedir o próximo conjunto de ascii para depois passar pelo chr() e concatenar tudo e verificar, o problema e que me deu um erro aqui e ja tentei de todas as formas e nada, e sem ele resolvido não consigo avançar, se alguém me poder ajudar e se o erro for algo de caras me explicar porque acontece agradeço muito

codigo python:

import hashlib
class brute_force:
def nextascii(last):
 broken=last.split(',')
 h=int(len(broken)-1)
 j=int(h)
 i=0

 while i!=1:
	 if h==-1:
		 broken.append(int(0))
		 i=1
	 else:
		 if broken[h]=='':
			 broken[h]=int(0)
			 i=1
		 elif broken[h]=='255':
			 broken[h]=int(0)
			 h-=1
		 else:
			 broken[h]=int(broken[h])+1
			 i=1

 newascii=''.join(str(broken))
 return newascii
def asciitochar(ascii_string):
 ascii_string=ascii_string.split(',')
 charstring=''
 for i in range(len(ascii_string)):
	 if ascii_string[i]!='':
		 charstring+=(chr(int(ascii_string[i])))

 return charstring
class crypt:
def md5(string):

 string=hashlib.md5(string.encode()).hexdigest()

 return string
encrypt=input('insert hash: ')
print(brute_force.nextascii(encrypt))
encrypt=brute_force.nextascii(encrypt)
#print(brute_force.nextascii(encrypt))
#encrypt=brute_force.nextascii(encrypt)

o erro acontece depois de descomentar as 2 ultimas lines e o que eu faco e apenas isto:

insert hash: 1,2,3
['1', '2', 4]
Traceback (most recent call last):
File "C:\wamp\www\python\decrypt.py", line 59, in <module>
print(brute_force.nextascii(encrypt))
File "C:\wamp\www\python\decrypt.py", line 25, in nextascii
broken[h]=int(broken[h])+1
ValueError: invalid literal for int() with base 10: ' 4]'

desculpem pas queria saber mais coisa se possivel, como eu posso fazer isto de php no python?

function xpto(var=null){
}

declaracao:

xpto(0);
xpto();

estou a utilizar python 3.x

obrigado

Edited by spcl
GeSHi

Share this post


Link to post
Share on other sites
Rui Carlos

No início da função nextascii, faz imprime o valor do broken (logo depois de definires a variável).

O problema é que estás a definir mal o valor da variável broken (não podes simplesmente fazer um split).

Share this post


Link to post
Share on other sites
spcl

em ja imprimi e nada, ja tentei definir de outras maneiras e nada, tentei

broken=last
broken.split()
broken.split(',')

broken=[]
broken=last.split(',')

da-me sempre este erro:

insert hash: 1,2,3
['1', '2', 4]
Traceback (most recent call last):
File "C:\wamp\www\python\decrypt.py", line 59, in <module>
print(brute_force.nextascii(encrypt))
File "C:\wamp\www\python\decrypt.py", line 25, in nextascii
broken[h]=int(broken[h])+1
ValueError: invalid literal for int() with base 10: ' 4]'

será que me pode dizer como fazer?

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
spcl

ao digitar

normalmente aparece:

['1', '2', '3']

mas antes de acontecer o erro o broken aparece assim:

["['1'", " '2'", ' 4]']

quanto ao broken[h] imprime: 4]

Share this post


Link to post
Share on other sites
Rui Carlos

A tua função "funciona" para inputs como 1,2,3. O problema é que ela devolve algo com ['1', '2', 4].

Quando tentas chamar novamente a função com o resultado da chamada anterior, vai dar asneira, visto que tens ['1', '2', 4] em vez de 1, 2, 4.

Basicamente tens que tornar o output da função consistente com o input.

Deves usar chr(ord(broken[h])+1) para incrementar um carácter. Usas o ord em vez do int, pois queres obter o código ASCII e não saber que inteiro está representado, e depois usas o chr para converter novamente para um carácter.

Depois usas ','.join(broken) para fazer o inverso do split.

def nextascii(last):
	 broken=last.split(',')
	 h=int(len(broken)-1)
	 j=int(h)
	 i=0

	 while i!=1:
			 if h==-1:
					 broken.append(int(0))
					 i=1
			 else:
					 if broken[h]=='':
							 broken[h]=int(0)
							 i=1
					 elif broken[h]=='255':
							 broken[h]=int(0)
							 h-=1
					 else:
							 broken[h]=chr(ord(broken[h])+1)
							 i=1

	 newascii=','.join(broken)
	 return newascii

Share this post


Link to post
Share on other sites
spcl

era mesmo isto muito obrigado pela resolução e pela explicação e será que me poderia responder a segunda questão? agradecia imenso

como passo isto de php para python?, o que eu queria com isto era fazer os tratamentos dentro da funcao e independentemente de passar variável ou não ela continuar funcionando, no php passo assim:

function xpto(var=null){
}

xpto(0);
xpto();

Share this post


Link to post
Share on other sites
spcl

ja encontrei o que fazia de mal quando nao passava a var

eu fazia assim:

def xpto (var='NONE')

mas agora encontrei um problema no código, ainda dentro daquilo

se colocar no input: 1,2,9 e me retornado 1,2,: ja tentei fazer na proxima linha broken[h]=ord(broken[h]) visto que o que eu quero e o codigo do ascii e nao o caracter, dai eu ter feito isso, so que e me gerado um erro

insert hash: 1,2,3
Traceback (most recent call last):
File "C:\wamp\www\python\decrypt.py", line 51, in <module>
print(brute_force.nextascii(encrypt))
File "C:\wamp\www\python\decrypt.py", line 25, in nextascii
newascii=','.join(broken)
TypeError: sequence item 2: expected str instance, int found

fiz um print : print(broken[h]) e retornou 52, não estou a entender porque este erro

Edited by spcl

Share this post


Link to post
Share on other sites
Rui Carlos

Antes de continuares, acho que era conveniente definires de forma mais clara o que são os inputs e o que são os outputs de cada uma das funções que queres definir. Em particular define o tipo de dados do input e do output.

Estás a misturar inteiros, caracteres e strings, o que torna o código propício a erros.

Share this post


Link to post
Share on other sites
spcl

consegui resolver, e descobri o erro, na penúltima linha em:

newascii=','.join(broken), aqui estava a juntar tudo novamente, o problema e que o broken tinha valores int e outros str, o que eu fiz para resolver foi, ao dar o novo valor ao broken:

broken[h]=int(broken[h])+1, isto para poder somar, tive de fazer depois o contrario:

broken[h]=str(broken[h])

e resultou, obrigado pela ajuda

Share this post


Link to post
Share on other sites
Rui Carlos

A razão pela qual eu coloquei isso a juntar tudo de novo, era para que o output fosse do mesmo tipo que o input (uma string, com caracteres separados por vírgulas). Isto era necessário para que pudesses compor a função.

Pelo que percebi, afinal tu querias trabalhar com uma lista de inteiros, e não com a string, daí ter dito na minha mensagem anterior que devias definir melhor o que pretendes, e em particular o formato dos dados. Provavelmente, o melhor até seria acabares com as conversões de string para listas, e usares sempre listas na função nextascii.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.