【问题标题】:Reversing XOR Javascript Obfuscation Function with Python用 Python 反转 XOR Javascript 混淆函数
【发布时间】:2019-12-19 09:38:51
【问题描述】:

所以我在查看一个被入侵的 WordPress 网站并看到了这个注入的 js。它基本上进行了一轮混淆(charCodeAt(13-3,9-2等)。然后,它输出以下内容:

var key = 'eooquewZmf';
var enced = '<encoded_base64_blob>';

function xor_enc(string, key) {
  var res = '';
  for (var i = 0; i < string.length; i++) {
    res += String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(i % key.length));
  }
  return res;
}

我真的是想通过在 Python 中编写一个反混淆器来理解混淆技术,而不是仅仅通过运行 JS 文件并获取明文来获取明文数据。

所以我首先尝试了解代码发生了什么:

变量

key = xor key, enced = 要解码的文本

功能

xor_enc 似乎有两个论点,“string”和“key”。 变量“res”是一个空字符串 一个 for 循环被初始化,将从 0 变为字符串的长度,一次一个字符 “res”变量将由以下内容填充:

a) "string" 的每个字符都会被转换成一个字符 b) i % (modulo) 的位置乘以密钥的完整长度(10 个字符)

然后是 XOR b。然后将其返回。

所以我认为我的主要问题是理解 b 并在 Python 中复制它。这是我到目前为止所拥有的:https://repl.it/repls/CluelessUnsungDisc,但它是 fubar 并且返回以下错误:

File "main.py", line 8, in <module>
    newstring += chr(ord(dec[letter]) ^ ord(letter % len(key)))
TypeError: ord() expected string of length 1, but int found

我不知道是我的括号还是嵌套,但 ord 没有正确看到字符位置。

原始 JS 在这里:https://pastebin.com/yMz6aP7V((请记住,它的 JS 来自受感染的 WordPress 站点,因此可能是恶意的)

任何帮助将不胜感激!

based ="<base64>"
dec = base64.b64decode(based)
print(dec)
key = 'eooquewZmf'
newstring = ''
for letter in range(len(dec)):
    newstring += chr(ord(dec[letter]) ^ ord(letter % len(key)))
    print(newstring)

File "main.py", line 8, in <module>
    newstring += chr(ord(dec[letter]) ^ ord(letter % len(key)))
TypeError: ord() expected string of length 1, but int found

【问题讨论】:

  • 你能不能把.放在句子的末尾而不是像那样把它们放在一起?

标签: javascript python obfuscation deobfuscation


【解决方案1】:

您应该与key 的元素进行异或运算。 letter % len(key) 是该元素的索引(它只是循环遍历带有环绕的键)。

b64decode() 返回一个bytes 对象而不是字符串,因此您可以将元素作为整数访问,无需调用ord()

import base64

def b64_xor(b64,key):
  dec = base64.b64decode(b64)
  newstring = ''
  for i, letter in enumerate(dec):
    newstring += chr(letter ^ ord(key[i % len(key)]))
  print(newstring)

DEMO

【讨论】:

  • 您好,由于某种原因,该更改仍会引发错误。但我不太清楚为什么。仍在解决解决方案。谢谢。
  • 这似乎做到了:newstring += chr(ord(chr(dec[i])) ^ ord(key[i % len(key)]))我在遍历 B64 字符时添加了一个额外的“chr”
  • ord(chr(x))x 相同。 chr() 的参数应该是一个数字,但 dec[i] 是一个字符。
  • 我看到了问题。 b64decode 返回 bytes,而不是字符串。首先没有必要打电话给chr()。我已经更新了答案。
猜你喜欢
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2020-12-04
  • 2011-05-25
相关资源
最近更新 更多