기초 Linux 서버관리2014. 5. 13. 16:28

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)                           = ?

#


정상적으로 파일 실행되었다.



Posted by 박물지