资源简介

Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF。 在ctf比赛中,有时会碰到需要解brainfuck或ook的情况,一般会使用在线解码网站:https://www.splitbrain.org/services/ook 当在不能接入外网的场景下解题,则需要一个离线脚本。故优化了github上的一个项目完成了该解码脚本,支持brainfuck、ook以及short ook。

资源截图

代码片段和文件信息

# -*- coding:utf-8 -*-
import sys
from collections import deque

class LoopError(Exception):
pass

class OokParser(object):
def __init__(self):
self.BEGIN = (‘!‘ ‘?‘)
self.END = (‘?‘ ‘!‘)
self.primitives = {(‘.‘ ‘.‘): ‘inc‘
   (‘!‘ ‘!‘): ‘dec‘
   (‘.‘ ‘?‘): ‘right‘
   (‘?‘ ‘.‘): ‘left‘
   (‘!‘ ‘.‘): ‘write‘
   (‘.‘ ‘!‘): ‘read‘}
   
def parse(self input_text):
items = input_text.lower().replace(‘ook‘‘‘).replace(‘ ‘ ‘‘).replace(‘\n‘‘‘).replace(‘\r‘‘‘)
for i in range(0 len(items) 2):
x = (items[i] items[i+1])
if x in self.primitives or x in (self.BEGIN self.END):
yield x

class BrainfuckParser(object):
def __init__(self):
self.BEGIN = ‘[‘
self.END = ‘]‘
self.primitives = {‘+‘: ‘inc‘
   ‘-‘: ‘dec‘
   ‘>‘: ‘right‘
   ‘<‘: ‘left‘
   ‘.‘: ‘write‘
   ‘‘: ‘read‘}
   
def parse(self input_text):
for x in input_text:
if x in self.primitives or x in (self.BEGIN self.END):
yield x

class Interpreter(object):
MAX_NESTED_LOOPS = 1000

def __init__(self ook_mode=True):
self.bf_parser = BrainfuckParser()
self.ook_parser = OokParser()
self.set_parser(ook_mode and self.ook_parser or self.bf_parser)

def reset(self):
self.cells = deque([0])
self.index = 0
self.input_buffer = []
self.output_buffer = []
self.open_loops = 0
self.loop = []

def inc(self):
self.cells[self.index] += 1

def dec(self):
self.cells[self.index] -= 1

def right(self):
self.index += 1
if self.index >= len(self.cells):
self.cells.append(0)

def left(self):
if self.index == 0:
self.cells.appendleft(0)
else:
self.index -= 1

def write(self):
self.output_buffer.append(self.cells[self.index])

def read(self):
try:
self.cells[self.index] = int(raw_input(“Your input: “))
except (TypeError ValueError):
print “Invalid input! Continuing ...“

def as_ascii(self):
return ““.join([chr(c) for c in self.output_buffer])

def set_parser(self parser):
self.parser = parser
self.reset()

def interpret_raw_text(self text):
self.input_buffer.extend(self.parser.parse(text))
try:
self.interpret_items(self.input_buffer)
except IndexError:
print “ ... (incomplete)“
except LoopError:
print “LoopError ... exiting“
sys.exit(1)

def interpret_items(self items):
for item in items:
if self.open_loops:
self.interpret_inside_loop(item)
else:
self.interpret_directly(item)

def interpret_inside_loop(self item):
if item == self.parser.END:
self.open_loops -= 1
if self.open_loops == 0:
while self.cells[self.index]:
self.interpret_items(self.loop)
return
elif item == self.parser.BEGIN:
if self.open_loops < self.MAX_NESTED_LOOPS:
self.open_loops += 1
else:
raise LoopError(“Nesting maximum (%s) exceeded“ 
% self.MAX_NEST

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        390  2018-09-25 16:31  BrainFuck(Ook)\brainfuck.txt

     文件      11941  2018-09-25 16:56  BrainFuck(Ook)\example.png

     文件       5070  2018-09-25 16:53  BrainFuck(Ook)\ook.py

     文件       2280  2018-09-25 16:06  BrainFuck(Ook)\ook.txt

     文件        867  2018-09-25 15:20  BrainFuck(Ook)\shortOok.txt

     目录          0  2018-09-25 16:56  BrainFuck(Ook)

----------- ---------  ---------- -----  ----

                20548                    6


评论

共有 条评论