game
IDA打开main函数啥有用的信息都看不到
运行一下发现是个八数码问题,要求解10000000次
根据提示符去IDA的strings窗口找可以发现内存中存在这部分数据,但是没有交叉引用
说明该字符串在汇编层面是没有引用的
一般来说,用户添加的信息会放在一起,所以可以在提示字符串上下翻一翻,果然找到一点有意思的东西
这个\x1BLuaQ很引入注目,大概率就是lua逆向了
去查一下1B 4C 75 61
,可以看到是Lua的字节码文件头
那么再用Lua搜一下
可以获得版本号
或者通过文件解析也可以知道后一个字节51
代表版本号
由此可见这个程序是lua打包生成的exe,实际上就是自带一个Lua解释器和脚本
那么把脚本抓下来然后反编译即可
稍微搜了一下,这个脚本没有指示长度的字节,是类似于pyc那样递归解析的。
因此需要尽可能多的dump,我抓了0x1500字节时即可解析了
反编译工具
使用方法:
java -jar unluac.jar xxx.lua
require("bit")
borad = {
{
1,
2,
3
},
{
4,
5,
6
},
{
7,
8,
0
}
}
sx = 3
sy = 3
function swap_chess(x, y, xx, yy)
local t = borad[x][y]
borad[x][y] = borad[xx][yy]
borad[xx][yy] = t
end
function move_chess(d)
if d == "S" and sx == 1 or d == "W" and sx == 3 or d == "D" and sy == 1 or d == "A" and sy == 3 then
return
end
if d == "S" then
swap_chess(sx, sy, sx - 1, sy)
sx = sx - 1
elseif d == "W" then
swap_chess(sx, sy, sx + 1, sy)
sx = sx + 1
elseif d == "D" then
swap_chess(sx, sy, sx, sy - 1)
sy = sy - 1
elseif d == "A" then
swap_chess(sx, sy, sx, sy + 1)
sy = sy + 1
end
end
function randomize()
local d = {
"W",
"S",
"A",
"D"
}
math.randomseed(os.time())
for i = 1, 1000 do
move_chess(d[math.random(4)])
end
end
function display()
local s = ""
for x = 1, 3 do
for y = 1, 3 do
s = s .. "| " .. borad[x][y] .. " "
end
s = s .. "|\n"
if x ~= 3 then
s = s .. "-------------\n"
end
end
s = s .. "\n"
io.write(s)
end
secret = {
171,
201,
244,
200,
118,
100,
138,
190,
170,
159,
94,
91,
42,
184,
8,
98,
198,
134,
110,