您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 廊坊分类信息网,免费分类信息发布

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

2023/5/22 22:37:27发布39次查看
由于有几个内置的函数,这个开发者可以使用python轻松地解决一个复杂的难题。继续阅读,看看如何!
在我第一次ctf(夺旗)比赛中,我注意到一些挑战需要角色转换才能发现一个字符串的真实价值。我花了几分钟的时间试图找出一个可以用来“揭露”给定内容的模式。
挑战1
收集有关给定ip地址的信息后,找到一个文件,其中包含以下内容:
rxms {} dqhqdeqprxms它看起来完全是随机的,但是鉴于这些标志有一个模式:“flag {some-hash-here}”,我们可以尝试一个字符转换:
rxms{dqhqdeqprxms}synttzouuapvvbqwwcrxxdsyyetzzfuaagvbbhwccixddjyeekzfflag{...} <- real content
我们不得不在字母表中跳12个位置来获取字符串的真实内容。
挑战2
为了连接到一个服务,我们必须解决密码短语:
aqw ujcnn pqv rcuu乍一看,密码短语看起来像凯撒的密码。解决这个挑战也需要改变角色,但是这次倒退了:
aqw ujcnn pqv rcuuzpv tibmm opu qbttyou shall not pass <- backward content
python的救援
python有内置的函数ord()和chr()可以帮助我们完成这个任务:
class alphanumeric(object): alphabet_length = 26 def __init__(self, nrange=none): self.current_letter = 'z' self.current_number = 0 self.nrange = nrange def forward_letter(self, letter, positions): if letter.islower(): unicode_point = ord('a') else: unicode_point = ord('a') start = ord(letter) - unicode_point offset = ((start + positions) % self.alphabet_length) + unicode_point self.current_letter = chr(offset) return self.current_letter def backward_letter(self, letter, positions): if letter.islower(): unicode_point = ord('a') else: unicode_point = ord('a') start = ord(letter) - unicode_point offset = ((start - positions) % self.alphabet_length) + unicode_point self.current_letter = chr(offset) return self.current_letter def next_letter(self): return self.forward_letter(self.current_letter, 1) def previous_letter(self): return self.backward_letter(self.current_letter, 1) def forward_number(self, number, positions): if not self.nrange: self.current_number = number + positions return self.current_number index = self.nrange.index(number) start = index + positions offset = (start % len(self.nrange)) self.current_number = self.nrange[offset] return self.current_number def backward_number(self, number, positions): if not self.nrange: return number - positions index = self.nrange.index(number) start = index - positions offset = (start % len(self.nrange)) self.current_number = self.nrange[offset] return self.current_number def next_number(self): return self.forward_number(self.current_number, 1) def previous_number(self): return self.backward_number(self.current_number, 1) def forward_alphanumeric(self, alpha, positions, ignore_numbers=false, ignore_letters=false): result = for char in alpha: if char.isdigit() and not ignore_numbers: char = str(self.forward_number(int(char), positions)) if char.isalpha() and not ignore_letters: char = self.forward_letter(char, positions) result += char return result def backward_alphanumeric(self, alpha, positions, ignore_numbers=false, ignore_letters=false): result = for char in alpha: if char.isdigit() and not ignore_numbers: char = str(self.backward_number(int(char), positions)) if char.isalpha() and not ignore_letters: char = self.backward_letter(char, positions) result += char return result
使用字母数字类:
alpha = alphanumeric()print alpha.forward_alphanumeric('abc123', 1)print alpha.backward_alphanumeric('abc123', 1)// prints: bcd234// prints: zab012
请注意,您可以定义一个数字范围,以便在移动数字时执行“循环循环”:
alpha = alphanumeric([1, 2, 3, 4 , 5])print alpha.forward_alphanumeric('123', 6)// prints: 234
一个cli工具的救援
考虑下一个ctf的挑战,我写了一个名为shift的小cli工具,可以更容易地转换字母数字字符。
echo dqhqdeqp oazfqzf | python shift.py -p 12 --backwards// prints: reversed contentpython shift.py abc123 -p 5// prints: fgh678
您可以在github上看到文档和源代码。
廊坊分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录