180823 逆向-网鼎杯(2-2)

博客主要讲述了如何通过逆向工程解决一个涉及八数码问题的挑战。作者首先发现程序是Lua字节码打包的EXE,通过反编译和分析找到了解密脚本的方法。接着,博客提到了对Go语言编译的程序进行逆向分析的难点,并详细描述了如何修正IDA的参数和返回值识别问题,以便更好地理解程序的逻辑。
摘要由CSDN通过智能技术生成

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,
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值