- Lua有一种预编译机制,能够把文本代码预编译成Bytecode/Opcode 提高解析、执行速度,降低内存占用
- 原版Lua(Vanilla Lua)默认的Bytecode的字节结构和OpenWrt的并不相同,因为OpenWrt为了一系列需要,在截止我写此文时候,在Lua5.1.5的版本主线上,对原版的LUA引擎打了补丁 ,导致其产生的字节码和原版的Lua产生的并不一样,( http://lua-users.org/lists/lua-l/2012-06/msg00065.html ),因此也不能使用原版的Lua引擎解释,会报类似 bad header in precompiled chunk 的错误
- 本机尝试逆向原版的Lua产生的LuaC, 使用这个luadec 项目无任何问题 ,但是逆向Openwrt上的luaC失败,所以需要在Openwrt的Patch过的Lua lib的基础上,编译luadec
- 过程记录如下,全程在Linux Deepin 15.5上完成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#安装依赖 sudo apt install libncurses-dev libreadline-dev #获得luadec源码 git clone https://github.com/viruscamp/luadec cd luadec git submodule update --init lua-5.1 #下面开始不同 ref=master patch_dir=patches.$ref mkdir $patch_dir && cd $patch_dir #如下命令需要grep支持pcre正则,如果不支持,请自己手动处理把。 patchs=$(curl -sSL -H 'Accept: application/vnd.github.v3+json' 'https://api.github.com/repos/openwrt/openwrt/contents/package/utils/lua/patches?ref='"$ref" |grep -oP 'name\"\s*:\s*\".*\.patch' |grep -oP '\d+.*\.patch') #下载补丁文件 for p in $patchs;do wget 'https://github.com/openwrt-mirror/openwrt/raw/'"$ref"'/package/utils/lua/patches/'${p} -O $p; done cd ../lua-5.1 #打上补丁 for i in ../${patch_dir}/*.patch; do patch -p1 <$i ; done make linux |
到这一步 其实会出现错误的,有提示
lauxlib.o: relocation R_X86_64_PC32 against symbol `stderr@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
需要修改Makefile 给CFLAGS加上 -fPIC 选项 另外,为了使得Patch过后生成的so文件带版本号,还需要加上版本,最终生成的是如下的lua-5.1/src/Makefile的补丁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
--- Makefile.bak 2018-05-29 18:04:44.979014076 +0800 +++ Makefile 2018-05-29 18:21:35.110112120 +0800 @@ -8,7 +8,7 @@ PLAT= none CC= gcc -CFLAGS= -O2 -Wall $(MYCFLAGS) +CFLAGS= -fPIC -O2 -Wall $(MYCFLAGS) AR= ar rcu RANLIB= ranlib RM= rm -f @@ -18,7 +18,7 @@ MYLDFLAGS= MYLIBS= # USE_READLINE=1 - +PKG_VERSION = 5.1.5 # == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE ========= PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris |
继续执行make linux应该不会报错了,然后按照luadec的教程继续做完就可以了
1 2 3 4 |
make linux export LD_LIBRARY_PATH=`pwd`/src/ cd ../luadec make LUAVER=5.1 |
生成的3个可执行文件luadec luaopswap luareplace就是全部,她就可以直接解码openwrt的luaC的Bytecode了 这里提供编译好的文件下载
编译通过,但是反编译还是报错:bad header in precompiled chunk
Archer AX21 v3固件,cgi.lua,第12字节是04,不明白这个含义是否代表加密,大佬有空帮忙看下,谢谢啦
1b4c 7561 5100 0104 0404 0804 0000 0000
0000 0000 0000 0000 0000 0203 1f00 0000
0140 0000 0080 4000 2280 8000 0200 0000
01c0 0000 4800 0100 8140 0100 8080 4101
2240 8001 01c0 0100 4800 0200 2280 0001
41c0 0100 8840 0200 6240 0001 41c0 0100
8880 0200 6240 0001 41c0 0100 88c0 0200
6240 0001 41c0 0100 8800 0300 6240 0001
6100 0000 1b00 0000 a140 0000 1b00 8000
1b00 0000 8240 0300 2300 8000 0e00 0000
0409 0000 0065 7865 6374 696d 6500 0403
0000 006f 7300 0406 0000 0063 6c6f 636b
0004 0700 0000 6d6f 6475 6c65 0004 0d00
0000 6c75 6369 2e73 6769 2e63 6769 0004
0800 0000 7061 636b 6167 6500 0407 0000
0073 6565 616c 6c00 0408 0000 0072 6571
7569 7265 0004 0b00 0000 6c75 6369 2e6c
746e 3132 0004 0b00 0000 6e69 7869 6f2e
7574 696c 0004 0a00 0000 6c75 6369 2e68
7474 7000 0409 0000 006c 7563 692e 7379
7300 0410 0000 006c 7563 692e 6469 7370
6174 6368 6572 0004 0400 0000 7275 6e00
0200 0000 0000 0000 2300 0000 3400 0000
0102 0004 0b00 0000 5940 0000 1800 0080
4800 0000 8a00 0000 8040 4001 e100 0000
1b00 8000 1b00 0000 1b00 0001 e300 0001
2300 8000 0200 0000 0900 0000 0004 0a00
0000 424c 4f43 4b53 495a 4500 0100 0000
0000 0000 2700 0000 3300 0000 0300 0004
1f00 0000 0a00 0000 0b00 4000 1840 0180
0a00 8000 0640 4000 2240 0001 0700 0000
2300 0001 1800 0580 0a00 0000 4a00 0001
0b00 8000 1880 0080 0a00 0001 1940 0000
1800 0080 0a00 0000 4a00 0000 5000 8000
4300 0000 4a00 8000 4680 c000 db00 0000
6280 8001 5940 0000 1880 0080 8a00 8000
8640 4001 a240 0001 6300 0001 2300 8000
0300 0000 0901 0000 0004 0600 0000 636c
6f73 6500 0405 0000 0072 6561 6400 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 3600
0000 5f00 0000 0200 000e 7c00 0000 0100
0000 0040 4000 0080 4000 4100 0000 40c0
c000 4000 c100 6280 8000 8a00 0000 c140
0100 c080 c101 01c1 0100 4101 0000 40c1
c002 4001 c102 8801 0200 6201 0001 2201
0000 a280 0000 ca00 8000 c040 c201 c080
c201 0141 0100 00c1 4202 e200 0001 2280
0000 4100 0300 4040 c300 8100 0000 8080
4301 80c0 4301 6280 0001 8800 0400 c900
8000 0101 0300 0041 4402 5b01 8000 2281
0001 4d80 4402 18c0 1480 0101 0300 00c1
4402 5b01 8000 9b01 0000 2241 8101 1941
0000 1840 0280 0102 0500 4842 0500 2242
0001 0102 0500 4882 0500 2242 0001 0102
0500 5b02 8002 2242 0001 1880 1080 d900
0000 1880 f97f 0dc0 c502 18c0 0280 0142
0100 0002 4604 4842 0600 8182 0600 db02
0003 a282 0001 c8c2 0600 1b03 8003 4803
0700 5742 8304 2242 0001 1800 f67f 0d40
c702 1880 0180 1b02 0001 5b02 0003 8882
0700 db02 8003 0803 0700 9700 0304 18c0
f37f 0dc0 c702 1800 0280 0142 0100 0002
4604 5b02 0001 2242 0001 0142 0100 0002
4604 4802 0700 2242 0001 1800 f17f 0d00
c802 1800 0280 0142 0100 0002 4604 4182
0600 9a42 0003 1800 0080 8802 0400 6202
0001 2242 0000 1840 ee7f 0d40 c802 18c0
0180 0142 0100 0082 4804 2242 8000 0142
0100 00c2 4804 2242 8000 c900 0000 18c0
eb7f 0d00 c902 1840 eb7f 0642 4903 8182
0900 80c2 4905 db02 8003 2242 0002 06c2
4803 2242 0001 1840 e97f 2300 8000 2800
0000 0405 0000 006c 7563 6900 0405 0000
0068 7474 7000 0408 0000 0052 6571 7565
7374 0004 0400 0000 7379 7300 0407 0000
0067 6574 656e 7600 0403 0000 0069 6f00
0406 0000 0073 7464 696e 0004 0900 0000
746f 6e75 6d62 6572 0004 0f00 0000 434f
4e54 454e 545f 4c45 4e47 5448 0004 0500
0000 7369 6e6b 0004 0500 0000 6669 6c65
0004 0700 0000 7374 6465 7272 0004 0a00
0000 636f 726f 7574 696e 6500 0407 0000
0063 7265 6174 6500 040b 0000 0064 6973
7061 7463 6865 7200 040d 0000 0068 7474
7064 6973 7061 7463 6800 0401 0000 0000
0407 0000 0073 7461 7475 7300 0405 0000
0064 6561 6400 0407 0000 0072 6573 756d
6500 0406 0000 0070 7269 6e74 0004 2200
0000 5374 6174 7573 3a20 3530 3020 496e
7465 726e 616c 2053 6572 7665 7220 4572
726f 7200 041a 0000 0043 6f6e 7465 6e74
2d54 7970 653a 2074 6578 742f 706c 6169
6e0a 0009 0100 0000 0406 0000 0077 7269
7465 0004 0900 0000 5374 6174 7573 3a20
0004 0900 0000 746f 7374 7269 6e67 0004
0200 0000 2000 0403 0000 000d 0a00 0902
0000 0004 0300 0000 3a20 0009 0300 0000
0904 0000 0009 0500 0000 0406 0000 0066
6c75 7368 0004 0600 0000 636c 6f73 6500
0906 0000 0004 0600 0000 636f 7079 7a00
0406 0000 006e 6978 696f 0004 0700 0000
7374 646f 7574 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 00
gcc -o lua -L. -llua lua.o -lm -Wl,-E -ldl
/usr/bin/ld: lua.o: in function
lstop':
lua_sethook'lua.c:(.text+0x3b): undefined reference to
/usr/bin/ld: lua.o: in function
pushline':
lua_getfield'lua.c:(.text+0xfa): undefined reference to
/usr/bin/ld: lua.c:(.text+0x109): undefined reference to
lua_tolstring'
lua_settop'/usr/bin/ld: lua.c:(.text+0x127): undefined reference to
/usr/bin/ld: lua.c:(.text+0x1c7): undefined reference to
lua_pushstring'
lua_getfield'/usr/bin/ld: lua.c:(.text+0x205): undefined reference to
/usr/bin/ld: lua.c:(.text+0x214): undefined reference to
lua_tolstring'
lua_pushfstring'/usr/bin/ld: lua.c:(.text+0x251): undefined reference to
/usr/bin/ld: lua.o: in function `docall':
make linux 报错
大人,请问一下,为什么我拿到的lua文件中的000B这个头地址,数据是04?不是01也不是02。该怎么反编译?
你是怎么编译通过的,我这总报错啊
老哥 能发一下 编译好的吗 我按照你的方式不行了,因为好多资源都提示 404 了。
谢谢
openwrt-mirror仓库改地址为openwrt了