shc로 바이너리한 파일 crontab에서 실행 안 될때.
shc는 파일 내용을 공개하기가 껄끄러울 때, 파일 안의 내용을 바이너리로 변경해 주는 명령어이다.
설치 및 사용 방법은 아래 링크를 참고 하시기 바랍니다.
http://www.thegeekstuff.com/2012/05/encrypt-bash-shell-script/
shc 설치 방법은 구글에서 찾아 보면 많이 있기 때문에 따로 기재하지 않았다.
shc 설치 완료하면 shc -f 파일명 입력하면 아주 간단하게 바이너리 파일이 생성이 된다.
그러나, 문제는 crontab에 넣어서 자동으로 실행하게 되면 cron로그에는 실행되었다고 찍히지만,
ps aux 프로세스 상태들을 보면 무수히 많은 좀비 프로세스가 존재할 것이다.
왜 이런 현상이 일어나는지 간단하게 확인해 보겠다.
# strace sh -c ./test.pl
<...중략...>
mprotect(0x3b6db8a000, 16384, PROT_READ) = 0
mprotect(0x3b6d21f000, 4096, PROT_READ) = 0
munmap(0x7ff4eb76e000, 43170) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff4eb76c9d0) = 10241
wait4(10241, ./test.pl.x: Operation not permitted
<unfinished ...>
+++ killed by SIGKILL +++
Killed
#
마지막에 핵심 문구가 떡하니 보인다.
"Operation not permitted"
"Operation not permitted" 문구는 속성 제한이 있을 때,보여지는 문구인데 파일 속성에 문제가 있나? 한번 살펴 보자
# lsattr ./test.pl
-------------e- ./test.pl
속성 걸린 것이 없다.(e는 ext4를 나타내는 것이니 무시하자. 필자의 OS는 centos 6.5이고 ext4환경이다.)
그럼 바이너리 변경이 될 때, 문제가 있다는 건데 shc 옵션을 한번 볼까.
-e %s Expiration date in dd/mm/yyyy format [none]
-m %s Message to display upon expiration ["Please contact your provider"]
-f %s File name of the script to compile
-i %s Inline option for the shell interpreter i.e: -e
-x %s eXec command, as a printf format i.e: exec('%s',@ARGV);
-l %s Last shell option i.e: --
-r Relax security. Make a redistributable binary
-v Verbose compilation
-D Switch ON debug exec calls [OFF]
-T Allow binary to be traceable [no]
-C Display license and exit
-A Display abstract and exit
-h Display help and exit
Environment variables used:
Name Default Usage
CC cc C compiler command
CFLAGS <none> C compiler flags
여기서 나의 눈에 들어 오는 것이
-r , -T 이었다.
따라서, 다시 한번 옵션을 변경하여 바이너리 파일을 생성해 보자
shc -r -v -T -f ./test.pl
재strace 결과
<...중략...>
rt_sigaction(SIGIO, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGSYS, NULL, {SIG_DFL, [], 0}, 8) = 0
close(3) = 0
exit_group(0) = ?
#
정상적으로 파일 실행되었다.
끝