Advertisement
sysopfb

Script to decode jscript from 70a6a7ba56bed99021acc3c9465adf

Aug 14th, 2018
354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.78 KB | None | 0 0
  1. import sys
  2. import re
  3. import struct
  4. import base64
  5. import binascii
  6. from z3 import *
  7.  
  8.  
  9. possible_decodes = [bytearray('(function')]
  10.  
  11. def solve_docdropper(input, output):
  12. xor_1 = BitVec('xor_1', 8)
  13. xor_2 = BitVec('xor_2', 8)
  14. xor_3 = BitVec('xor_3', 8)
  15. xor_4 = BitVec('xor_4', 8)
  16.  
  17. s = Solver()
  18.  
  19. for i in range(0,min(len(input),len(output)),4):
  20. s.add((BitVecVal(input[i],8)) ^ xor_1 == BitVecVal(output[i],8))
  21. s.add((BitVecVal(input[i+1],8)) ^ xor_2 == BitVecVal(output[i+1],8))
  22. s.add((BitVecVal(input[i+2],8)) ^ xor_3 == BitVecVal(output[i+2],8))
  23. s.add((BitVecVal(input[i+3],8)) ^ xor_4 == BitVecVal(output[i+3],8))
  24. #s.check()
  25. return(s)
  26.  
  27.  
  28. def decoder(data):
  29. decoded = ""
  30. blobs = data.split('\x00\x00\x00\x00')
  31. blobs = filter(lambda x: len(x) > 1000, blobs)
  32.  
  33. done = False
  34.  
  35. for encoded in blobs:
  36. #Try z3 solvers
  37. a = bytearray(encoded.lstrip('\x00'))
  38. for poss_decode in possible_decodes:
  39. s = solve_docdropper(a[:8], poss_decode)
  40. if s.check() == sat:
  41. m = s.model()
  42. for d in m.decls():
  43. if d.name() == 'xor_1':
  44. xor1_val = m[d].as_long()
  45. elif d.name() == 'xor_2':
  46. xor2_val = m[d].as_long()
  47. elif d.name() == 'xor_3':
  48. xor3_val = m[d].as_long()
  49. elif d.name() == 'xor_4':
  50. xor4_val = m[d].as_long()
  51. print("XOR1: "+hex(xor1_val))
  52. print("XOR2: "+hex(xor2_val))
  53. print("XOR3: "+hex(xor3_val))
  54. print("XOR4: "+hex(xor4_val))
  55. key = [xor1_val, xor2_val, xor3_val, xor4_val]
  56. for i in range(len(a)):
  57. temp = a[i] ^ key[i%len(key)]
  58. if temp < 0x20 or temp > 0x7e:
  59. break
  60. else:
  61. decoded += chr(temp)
  62. return decoded
  63.  
  64. if __name__ == "__main__":
  65. data = open(sys.argv[1],'rb').read()
  66. out = decoder(data)
  67. open(sys.argv[1]+'.decoded', 'wb').write(out)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement