티스토리 뷰

최근에 분석한 Router 들을 보면 OpenWrt OS 기반의 웹 인터페이스를 참 많이 사용하고 있다.

OpenWrt의 uhttpd는 cgi-bin/으로 요청을 보내는데 이를 처리하는 것이 lua bytecode이다.

그런데 이 lua bytecode는 이미 컴파일 되어있는 파일이라 분석하기 어려워 디컴파일이 필요하다.

lua bytecode의 디컴파일러 중 하나인 luadec을 설치하는 내용이다. (unluac.jar를 이용해도 디컴파일이 가능)

 

https://github.com/viruscamp/luadec

 

viruscamp/luadec

Lua Decompiler for lua 5.1 , 5.2 and 5.3. Contribute to viruscamp/luadec development by creating an account on GitHub.

github.com

install 

ubuntu 16.04 기준입니당


# 환경 설정
sudo apt install libncurses-dev libreadline-dev

# 소스코드 다운로드
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

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://raw.githubusercontent.com/openwrt/openwrt/master/package/utils/lua/patches/'${p}  -O $p;
done

# 패치 적용
cd ../lua-5.1
for i in ../${patch_dir}/*.patch; do patch -p1 <$i ; done

# src/Makefile 수정
하늘색으로 표시된 부분은 삭제하고 빨간색으로 표시된 부분은 추가하시면 됩니다

+++ 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 =========
@@ -61,10 +62,10 @@
ln -fs $@.$(PKG_VERSION) $@
$(LUA_T): $(LUA_O) $(LUA_SO)
- $(CC) -o $@ -L. -llua $(MYLDFLAGS) $(LUA_O) $(LIBS)
+ $(CC) -o $@ $(LUA_O) $(MYLDFLAGS) -L. -llua $(LIBS)
$(LUAC_T): $(LUAC_O) $(LUA_SO)
- $(CC) -o $@ -L. -llua $(MYLDFLAGS) $(LUAC_O) $(LIBS)
+ $(CC) -o $@ $(LUAC_O) $(MYLDFLAGS) -L. -llua $(LIBS)
$(LUAC_T)-host: $(LUAC_O) $(LUA_A)
$(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)

# 빌드
make linux
export LD_LIBRARY_PATH=`pwd`/src/
cd ../luadec
make LUAVER=5.1

# 명령어로 등록
sudo cp luadec /usr/local/bin/
sudo cp luaopswap /usr/local/bin/ # optional
sudo cp luareplace /usr/local/bin/ # optional

이렇게 설치하면 lua 디컴파일러를 사용할 수 있다.

Optional

+ LNUM_INT32를 define 하고 싶다면 luadec/lua-5.x/src/luaconf.h의 주석을 삭제하고 define 한다.

  -/*#define LNUM_INT32*/

  +#define LNUM_INT32     4

  참고 : https://m3rg3ry.tistory.com/39

 

+ 만약 bad header in precompiled chunk 에러가 발생한다면 아래 문서 참고

   참고 : 

'아이오티 > info' 카테고리의 다른 글

[Vuln]Xiaomi Remote Code Execution  (0) 2020.01.28
[info] lua bytecode header  (0) 2019.07.02
댓글
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31