Код дешифровки Луа

Я недавно загрузил некоторый код lua, и внутри я обнаружил некоторую запутанную строку. Это заставило меня задуматься о том, какую технику обфускации там использовали. У кого-нибудь есть идея?

local code='\27\76\117\97\81\0\1\4\4\4\8\0\64\0\0\0\64\67\58\92\85\115\101\114\115\92\65\108\101\120\92\68\101\115\107\116\111\112'
loadstring(code)()

РЕДАКТИРОВАТЬ: Еще немного (зашифрованный?) Код.

"\196\2\28\66\0\1\198\193\194\2\25\128\129\3\22\64\14\128\197\193\0\0\198\193\195\3\6\2\196\2\220\129\0\1\218'

4 ответа

Решение

Не выглядит зашифрованным вообще. Похоже, это просто последовательность байтов. Каждая обратная косая черта представляет символ с его байтовым кодом.

27 - escape, 76 - "L", 117 - "u", 97 - "a" и так далее.

Запуск его через короткий скрипт дает мне эту строку (символы являются специальными символами, такими как escape, начало заголовка и ноль): ←LuaQ ☺♦♦ @ @C:\Users\Alex\Desktop

Вы можете посмотреть байты в таблице ASCII.

Обновление: Небольшое исследование показало мне, что LuaQ означает, что это предварительно скомпилированный скрипт или что-то в этом роде. Я мог бы быть далеко, хотя.

Сложность в том, что loadstring и связанные функции принимают как код lua, так и байт-код lua. Это призыв к loadstring просто передается скомпилированный байт lua вместо исходного кода lua.

Вы можете легко получить скомпилированный байт. Вы можете получить пример, как это

  • Создайте файл lua.
  • Скомпилируйте его с помощью luac для генерации lauc.out
  • Посмотрите на содержимое файла с помощью шестнадцатеричной программы просмотра.

Для пустого файла lua я получаю:

0000000: 1b4c 7561 5100 0104 0804 0800 0900 0000  .LuaQ...........
0000010: 0000 0000 4066 6f6f 2e6c 7561 0000 0000  ....@foo.lua....
0000020: 0000 0000 0000 0002 0201 0000 001e 0080  ................
0000030: 0000 0000 0000 0000 0001 0000 0001 0000  ................
0000040: 0000 0000 0000 0000 00                   .........

Перевод первых 8 байтов в десятичный формат:

27, 76, 117, 97, 81, 0, 1, 4

Что соответствует экранированным символам в вашей строке.

Если вы хотите получить более подробную информацию о том, что делает код в чанке, вам нужно записать чанк в файл и использовать инструмент декомпиляции lua для расследования. ChunkSpy, luadec15 и unluac оба упомянуты на странице инструментов lua wiki.

В чанке, который вы мне предоставили, не хватает контента, чтобы продолжить, я полагаю, это усечено?

Если у него есть loadstring, простой способ, который не всегда работает, это просто добавление

loadstring = печать;

в начале

Вместо того, чтобы просто дать вам простой ответ, я хотел бы сообщить вам кое-что, чтобы знать, если вы столкнетесь с такими вещами по пути.

Этот вид запутывания не очень безопасен и на самом деле из таблицы ASCII. Обычно эти виды запутывания сделаны в Lua 5.1 и могут быть легко сделаны с помощью :byte а также table.concat, Вы можете просто перевернуть этот код с помощью более мощной версии объяснения Троя, которая может обойти большую часть безопасности:

function loadstring(input)
   print(input)
end

Надеюсь, вы поняли, как это работает. Как указывалось ранее, это можно повторить с помощью :byte а также table.concat использование.

Его легко деобфускировать шифрование

local a ='\196\2\28\66\0\1\198\193\194\2\25\128\129\3\22\64\14\128\197\193\0\0\198\193\195\3\6\2\196\2\220\129\0\1\218'
print(a)

Вы можете сделать это как

Старый код:

loadstring(your string)

вы просто можете увидеть / деобфускировать его, используя print() вместо loadstring()

Новый код:

print(your string) 

Новый сценарий:

local code='\27\76\117\97\81\0\1\4\4\4\8\0\64\0\0\0\64\67\58\92\85\115\101\114\115\92\65\108\101\120\92\68\101\115\107\116\111\112'

print(code)
Другие вопросы по тегам