
저는 CTF(캡처 플래그)를 연습 중이며 환경 변수의 내용을 보고 싶습니다.
MyEnv=`python3 -c 'print(64*"A"+"\x0a\x09\x0a\x0d",end="")'`
이제 hexdump
배관 입력 시 다음이 표시됩니다 echo
.
$ echo -n $MyEnv | hexdump -Cv
00000000 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 |AAAAAAAAAAAAAAAA|
00000010 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 |AAAAAAAAAAAAAAAA|
00000020 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 |AAAAAAAAAAAAAAAA|
00000030 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 |AAAAAAAAAAAAAAAA|
00000040 20 0d | .|
00000042
echo
이는 마지막 4개의 16진수를 인쇄하는 것을 꺼리는 것과 관련이 있습니다.
MyEnv
하지만 연습 문제를 풀었기 때문에 마지막 네 자리가 포함되어 있다는 것을 알고 있습니다 .
환경 변수의 바이너리 내용을 표시하는 방법은 무엇입니까?
답변1
$MyEnv
아니요, 따옴표가 없는 변수가 분할되고 변수의 문자 [1]을 잘라내는 것과 관련이 있습니다 IFS
. 기본적으로 공백( \x20
), 탭( \x09
) 및 개행( \x0a
)입니다. 그런 다음 공백 연결( ) echo
을 사용하여 분할 필드를 작성합니다 . \x20
.
이러한 문자를 보려면 변수를 인용 $MyEnv
하고 printf
대신 echo -n
[2]를 사용하십시오.
$ printf %s "$MyEnv" | hexdump -Cv
...
00000040 0a 09 0a 0d |....|
00000044
일반적으로 환경 변수에 이진 데이터를 저장할 수 없습니다. 이진 데이터는 NUL 바이트( \0
)를 포함할 수 있으며 환경 변수의 값은 0으로 끝나는 문자열입니다. NUL 바이트는 bash
내부(내보내지 않은) 변수 에도 적용되지 않습니다 .
[1] IFS의 문자가 "공백"이 아닌 경우 쉘은 실제로 단일 문자를 분할하고 빈 필드를 생성할 수 있습니다. 전체 설명은 다음 위치에 있습니다.필드 분할표준 부품.
[2] echo
표준 쉘은 \n
변수를 더욱 복잡하게 만들 수 있는 일부 백슬래시 이스케이프(예: 개행 문자 등)를 해석할 수 있습니다.