인코딩이 16진수일 때 ls -la를 수행하는 방법은 무엇입니까?

인코딩이 16진수일 때 ls -la를 수행하는 방법은 무엇입니까?

인터넷에는 \x0B\x2E...로 시작하는 것을 복사할 수 있다는 정말 나쁜 농담이 있었습니다(단지 예). 이 명령을 실행하면 터미널은 이를 sudo rm -rf /.

이 난독화를 어떻게 수행합니까? 방금 Cyberchef를 실행하고 명령을 ls -la16진수로 변환해 보았지만 구문이 있어도 명령이 실행되지 않습니다 \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"

관련 정보