Код дешифровки Луа
Я недавно загрузил некоторый код 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)