反向编译OpenWrt的Lua字节码 (Decompile Lua bytecode of OpenWRT)

  1. Lua有一种预编译机制,能够把文本代码预编译成Bytecode/Opcode 提高解析、执行速度,降低内存占用
  2. 原版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 的错误
  3. 本机尝试逆向原版的Lua产生的LuaC, 使用这个luadec 项目无任何问题   ,但是逆向Openwrt上的luaC失败,所以需要在Openwrt的Patch过的Lua lib的基础上,编译luadec
  4. 过程记录如下,全程在Linux Deepin 15.5上完成:

到这一步 其实会出现错误的,有提示

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的补丁

继续执行make linux应该不会报错了,然后按照luadec的教程继续做完就可以了

生成的3个可执行文件luadec luaopswap luareplace就是全部,她就可以直接解码openwrt的luaC的Bytecode了 这里提供编译好的文件下载

Author Info :
  • From:反向编译OpenWrt的Lua字节码 (Decompile Lua bytecode of OpenWRT)
  • URL:https://blog.ihipop.com/2018/05/5110.html
  • Please Reserve This Link,Thanks!
  • 《反向编译OpenWrt的Lua字节码 (Decompile Lua bytecode of OpenWRT)》上有6条评论

    1. 编译通过,但是反编译还是报错: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

    2. gcc -o lua -L. -llua lua.o -lm -Wl,-E -ldl
      /usr/bin/ld: lua.o: in function lstop':
      lua.c:(.text+0x3b): undefined reference to
      lua_sethook'
      /usr/bin/ld: lua.o: in function pushline':
      lua.c:(.text+0xfa): undefined reference to
      lua_getfield'
      /usr/bin/ld: lua.c:(.text+0x109): undefined reference to lua_tolstring'
      /usr/bin/ld: lua.c:(.text+0x127): undefined reference to
      lua_settop'
      /usr/bin/ld: lua.c:(.text+0x1c7): undefined reference to lua_pushstring'
      /usr/bin/ld: lua.c:(.text+0x205): undefined reference to
      lua_getfield'
      /usr/bin/ld: lua.c:(.text+0x214): undefined reference to lua_tolstring'
      /usr/bin/ld: lua.c:(.text+0x251): undefined reference to
      lua_pushfstring'
      /usr/bin/ld: lua.o: in function `docall':
      make linux 报错

    3. 大人,请问一下,为什么我拿到的lua文件中的000B这个头地址,数据是04?不是01也不是02。该怎么反编译?

    发表回复

    您的电子邮箱地址不会被公开。 必填项已用*标注