分析
这里给了个超长的lua脚本,格式化之后,首先看到的就是一个解密函数:
local v0 = string.char;
local v1 = string.byte;
local v2 = string.sub;
local v3 = bit32 or bit;
local v4 = v3.bxor;
local v5 = table.concat;
local v6 = table.insert;
local function v7(v24, v25)
local v26 = 0;
local v27;
while true do
if (v26 == 1) then
print(v5(v27)); -- 加一行,打印结果
return v5(v27);
end
if (v26 == 0) then
v27 = {};
for v44 = 1, #v24 do
v6(v27, v0(
v4(v1(v2(v24, v44, v44 + 1)), v1(v2(v25, 1 + ((v44 - 1) % #v25), 1 + ((v44 - 1) % #v25) + 1))) %
256));
end
v26 = 1;
end
end
end
为了知道解密结果,在返回的时候打印解密结果
运行脚本:
PS D:\Misc\CTF\ctf-bin\2023-Google-CTF\re-zermatt> luajit.exe .\zermatt.lua
tonumber
string
byte
string
char
string
sub
string
gsub
string
rep
table
concat
table
insert
math
ldexp
getfenv
setmetatable
pcall
select
unpack
tonumber
123
..
__index
__newindex
_____ _ ___ _____ ____
| __|___ ___ ___| |___| |_ _| __|
| | | . | . | . | | -_| -< | | | __|
|_____|___|___|_ |_|___|___| |_| |_|
|___| ZerMatt - misc
>
看到这里有一堆字符串,其中引起好奇的是unpack
接下来的代码是:一系列解密
local v8 = _G[v7("\79\15\131\30\40\13\20\203", "\59\96\237\107\69\111\113\185")];
local v9 = _G[v7("\55\2\190\232\63\247", "\68\118\204\129\81\144\122")][v7("\12\180\100\225",
"\110\205\16\132\107\85\33\139")];
local v10 = _G[v7("\243\205\101\215\89\95", "\128\185\23\190\55\56\100")][v7("\240\94\174\46",
"\147\54\207\92\126\115\131")];
local v11 = _G[v7("\109\25\35\60\115\10", "\30\109\81\85\29\109")][v7("\239\234\115", "\156\159\17\52\214\86\190")];
local v12 = _G[v7("\175\186\253\180\178\169", "\220\206\143\221")][v7("\213\149\104\47",
"\178\230\29\77\119\184\172")];
local v13 = _G[v7("\235\225\172\3\21\112", "\152\149\222\106\123\23")][v7("\167\216\54", "\213\189\70\150\35")];
local v14 = _G[v7("\28\78\87\120\13", "\104\47\53\20")][v7("\12\172\66\130\29\168", "\111\195\44\225\124\220")];
local v15 = _G[v7("\191\217\68\12\118", "\203\184\38\96\19\203")][v7("\199\55\96\124\83\218", "\174\89\19\25\33")];
local v16 = _G[v7("\6\46\6\90", "\107\79\114\50\46\151\231")][v7("\204\61\163\173\57",
"\160\89\198\213\73\234\89\215")];
local v17 = _G[v7("\194\77\101\178\251\203\94", "\165\40\17\212\158")] or function()
return _ENV;
end;
local v18 = _G[v7("\53\224\205\5\54\50\228\205\9\49\42\224", "\70\133\185\104\83")];
local v19 = _G[v7("\217\7\68\72\38", "\169\100\37\36\74")];
local v20 = _G[v7("\67\5\139\167\83\20", "\48\96\231\194")];
local v21 = _G[v7("\150\198\74\15\46\18", "\227\168\58\110\77\121\184\207")] or
_G[v7("\177\122\62\179\69", "\197\27\92\223\32\209\187\17")][v7("\238\13\79\194\248\8",
"\155\99\63\163")];
local v22 = _G[v7("\144\141\223\180\128\187\129\144", "\228\226\177\193\237\217")];
print("123"); -- 自己加的,用来分隔
发现对应unpack字符串解密的是v21变量
v21可能是个函数,搜索v21(
搜到8个结果
寻找作为返回值的v21调用,调用的时候,使用print打印其结果
在运行的时候,发现flag出现:
CTF{At_least_it_was_not_a_bytecode_base_sandbox_escape}