表哥有话说 第62期记一次路由器lua反编译过程
Posted SKSEC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表哥有话说 第62期记一次路由器lua反编译过程相关的知识,希望对你有一定的参考价值。
前言
本文只是简单介绍一次经历,其中技术细节暂不讨论
小小的吐槽
目前iot设备的安全问题令人担忧。另外,由于一些漏洞暂未修复,就不说明是哪家厂商了(修复太慢了)。
lua源码获取过程
去官网,下载某一版本固件,发现lua源码并没有加密(目前该版本已下线),好,本文结束(2333,不是
真实解密过程
不得不说,上述没有加密的固件在后面帮到了大忙。为了叙述方便就称这家厂商为A。
我第一次下载的就是A家的没有加密lua的固件,之后没多久还看过其他家的设备固件,并且lua同样没有做任何处理,就是以源码的形式存在的,当时并没有感觉到不对,直到我下载了A家另一款路由器固件。
很明显可以看出,既不是lua源码文件,也不是标准luac文件,所以根本没有办法直接反编译,只能去逆向他魔改的解释器了,幸好他给出了版本号
经过跟源码的比对,发现其魔改了解析文件的流程,重复了几个opcode,还打乱了opcode的顺序,经过测试发现其文件解析流程只是做了简单的修改,很好恢复,但是恢复opcode时候就傻眼了,因为其流程长这个样
并且无法正常反编译(貌似因为编译器优化了switch)怎么办?头铁硬逆吗,突然,灵光一现,我们可以编译一个相同版本的lua,使用其luac对之前泄露出来的源码进行一次“编译”,之后提取出luac,来进行对比opcode,寻找其一一对应关系。最终还原了大部分opcode的对应关系(有极个别的opcode,在源码中并没有用到,所以没有找到其对应关系),最后修改了unluac的源码,最终实现了反编译的效果
效果图
后来有次无意中看到这篇文章
[原创]用 Lua 简单还原 OpCode 顺序
(https://bbs.pediy.com/thread-250618.htm),发现思路差不多一样
unluac简单介绍
1.opcode 在 unluac/decompile/OpcodeMap.java 修改对应版本opcodemap即可
2.magic 在unluac/parse/BHeader.java
3.unluac/parse/LConstantType.java 修改常量类型标识
4.unluac/parse/LFunctionType.java改文件解析顺序
总结
利用其opcode在魔改版本和原始版本之间的对应,还原opcode
- END -
以上是关于表哥有话说 第62期记一次路由器lua反编译过程的主要内容,如果未能解决你的问题,请参考以下文章
记一次apisix编译报错:size of C type is unknown or too large at line 39, context: init_worker_by_lua*
记一次apisix编译报错:size of C type is unknown or too large at line 39, context: init_worker_by_lua*