使用Python轻松实现字母数字转换

治疗白癜风的费用 http://pf.39.net/bdfyy/bdfzg/141014/4492992.html

由于有几个内置的函数,这个开发者可以使用Python轻松地解决一个复杂的难题。继续阅读,看看如何!

在我第一次CTF(夺旗)比赛中,我注意到一些挑战需要角色转换才能发现一个字符串的真实价值。我花了几分钟的时间试图找出一个可以用来“揭露”给定内容的模式。

挑战1

收集有关给定IP地址的信息后,找到一个文件,其中包含以下内容:

rxms{}DqhqdeqpRxms它看起来完全是随机的,但是鉴于这些标志有一个模式:“flag{some-hash-here}”,我们可以尝试一个字符转换:

rxms{DqhqdeqpRxms}synttzouuapvvbqwwcrxxdsyyetzzfuaagvbbhwccixddjyeekzfflag{...}lt;-realcontent

我们不得不在字母表中跳12个位置来获取字符串的真实内容。

挑战2

为了连接到一个服务,我们必须解决密码短语:

AQWUJCNNPQVRCUU乍一看,密码短语看起来像凯撒的密码。解决这个挑战也需要改变角色,但是这次倒退了:

AQWUJCNNPQVRCUUZPVTIBMMOPUQBTTYOUSHALLNOTPASSlt;-backwardcontent

Python的救援

Python有内置的函数ord()和chr()可以帮助我们完成这个任务:

classAlphanumeric(object):ALPHABET_LENGTH=26def__init__(self,nrange=None):self.current_letter=zself.current_number=0self.nrange=nrangedefforward_letter(self,letter,positions):ifletter.islower():unicode_point=ord(a)else:unicode_point=ord(A)start=ord(letter)-unicode_pointoffset=((start+positions)%self.ALPHABET_LENGTH)+unicode_pointself.current_letter=chr(offset)returnself.current_letterdefbackward_letter(self,letter,positions):ifletter.islower():unicode_point=ord(a)else:unicode_point=ord(A)start=ord(letter)-unicode_pointoffset=((start-positions)%self.ALPHABET_LENGTH)+unicode_pointself.current_letter=chr(offset)returnself.current_letterdefnext_letter(self):returnself.forward_letter(self.current_letter,1)defprevious_letter(self):returnself.backward_letter(self.current_letter,1)defforward_number(self,number,positions):ifnotself.nrange:self.current_number=number+positionsreturnself.current_numberindex=self.nrange.index(number)start=index+positionsoffset=(start%len(self.nrange))self.current_number=self.nrange[offset]returnself.current_numberdefbackward_number(self,number,positions):ifnotself.nrange:returnnumber-positionsindex=self.nrange.index(number)start=index-positionsoffset=(start%len(self.nrange))self.current_number=self.nrange[offset]returnself.current_numberdefnext_number(self):returnself.forward_number(self.current_number,1)defprevious_number(self):returnself.backward_number(self.current_number,1)defforward_alphanumeric(self,alpha,positions,ignore_numbers=False,ignore_letters=False):result=forcharinalpha:ifchar.isdigit()andnotignore_numbers:char=str(self.forward_number(int(char),positions))ifchar.isalpha()andnotignore_letters:char=self.forward_letter(char,positions)result+=charreturnresultdefbackward_alphanumeric(self,alpha,positions,ignore_numbers=False,ignore_letters=False):result=forcharinalpha:ifchar.isdigit()andnotignore_numbers:char=str(self.backward_number(int(char),positions))ifchar.isalpha()andnotignore_letters:char=self.backward_letter(char,positions)result+=charreturnresult

使用字母数字类:

alpha=Alphanumeric()printalpha.forward_alphanumeric(abc,1)printalpha.backward_alphanumeric(abc,1)//prints:bcd//prints:zab

请注意,您可以定义一个数字范围,以便在移动数字时执行“循环循环”:

alpha=Alphanumeric([1,2,3,4,5])printalpha.forward_alphanumeric(,6)//prints:

一个CLI工具的救援

考虑下一个CTF的挑战,我写了一个名为shift的小CLI工具,可以更容易地转换字母数字字符。

echoDqhqdeqpOazfqzf

pythonshift.py-p12--backwards//prints:ReversedContentpythonshift.pyabc-p5//prints:fgh

您可以在GitHub上看到文档和源代码。




转载请注明:http://www.aierlanlan.com/grrz/1415.html