인터넷에는 \x0B\x2E...로 시작하는 것을 복사할 수 있다는 정말 나쁜 농담이 있었습니다(단지 예). 이 명령을 실행하면 터미널은 이를 sudo rm -rf /
.
이 난독화를 어떻게 수행합니까? 방금 Cyberchef를 실행하고 명령을 ls -la
16진수로 변환해 보았지만 구문이 있어도 명령이 실행되지 않습니다 \x<hexcodetwocharactershere>\x<hexcodetwocharactershere>
.
- 내가 뭘 잘못했나요?
- 비슷한 난독화 방법이 있나요?
PS 나는 이미 base64 인코딩 트릭을 알고 있지만 이를 위해서는 시스템에 base64가 설치되어 있어야 합니다.
전체적으로 나는 내 목표를 달성하기 위해 bash 이외의 다른 것을 사용하고 싶지 않습니다(따라서 base64 인코딩 도구 및 이와 유사한 도구, xxd, 파이프 없음).
답변1
대부분의 셸에서 코드는 다른 인용 연산자처럼 이 명령을 \x6c\x73\x20\x2d\x6c\x61
실행하려고 시도합니다 .x6cx73x20x2dx6cx61
\
es
또는 셸 에서는 명령 fish
을 실행하려고 시도 ls -la
하지만 해당 이름의 명령이 없기 때문에 실패할 수 있습니다. 에서는 참조 연산자는 아니지만 C와 유사한 이스케이프 시퀀스를 확장하는 데 사용할 수 있습니다 es
.\
Fish 에서는 \
참조 연산자(예: sh
/ csh
)이자 이스케이프 시퀀스 도입 연산자(예: ) 입니다 es
.
두 경우 모두 \x20
토큰 구분 기호는 쉘 구문에서 실제 공백 문자로 해석되지 않으므로 ls
명령을 인수로 실행하지 않습니다.-la
$'\x6c\x73\x20\x2d\x6c\x61'
ksh93 스타일 인용을 지원하는 쉘에 입력하는 경우에도 마찬가지입니다.
이러한 확장을 쉘 코드로 해석해야 합니다(예: , eval
, sh -c
... source
에 제공).
eval $'\x6c\x73\x20\x2d\x6c\x61'
아니면 최소한 분할을 거쳐야 합니다.
code=$'\x6c\x73\x20\x2d\x6c\x61'
$code # using split+glob in POSIX shells
$=code # explicit IFS-splitting in zsh
${(s[ ])code} # explicit splitting on space in zsh
답변2
bash에만 적용되지만 이것이 질문의 정신에 맞는지 확실하지 않습니다.
eval "$(printf "%b" "\x6c\x73\x20\x2d\x6c\x61")"
실행하기 전에 디코딩된 명령을 확인할 수 있습니다.
printf "%b\n" "\x6c\x73\x20\x2d\x6c\x61"