티스토리 뷰
최근에 분석한 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 |
댓글