Linux에서 이진 환경 변수를 가지고 놀면서 일부 싱글 바이트가 좋지 않은 것으로 보이는 이상한 행동을 발견했습니다. 나는 그것을 더 가깝게 조사했고 setenv()에 주어질 때 특정 바이트가 항상 "변환"되는 것으로 보인다. 이것 좀 봐 :바이너리 환경 변수 및 setenv()
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char array[256];
int i;
for(i = 1; i < 256; i++) {
array[i] = i;
}
setenv("badenv", array, 1);
system("/bin/sh");
return 0;
}
나는 echo $ badenv> test를 실행할 때; 16 진 덤프 시험은 내가 참조 :
0000000 0101 0302 0504 0706 2008 0c0b 0e0d 100f
0000010 1211 1413 1615 1817 1a19 1c1b 1e1d 201f
0000020 2221 2423 2625 2827 2a29 2c2b 2e2d 302f
0000030 3231 3433 3635 3837 3a39 3c3b 3e3d 403f
그 0 * 9는 0x20에 변환됩니다 것, 그리고 그 0xa는 다른 사람 사이에, 0xB로 변환됩니다.
나는 setenv()를 악용합니까, 아니면 일반적으로 일반적으로 환경 변수를 남용하고 있습니까? 맨 페이지를 살펴본 후 환경 변수가 바이너리 값을 처리 할 수 있는지 여부를 알아보기 위해 일부를 검색했지만 확실하지 않습니다.
이 동작의 원인은 무엇이며, 환경 변수를 사용하면서 그 주위에 어떤 방법이 있습니까?
env 변수에 들어갈 수있는 것에 대해 몇 가지 자동 제한이있는 것 같습니다. 'export a ='echo -e "\ t"'는 탭을 공백으로 대체하는 것과 같은 결과를 낳습니다. – elmo
'setenv'는 변수 값으로 0으로 끝나는 문자열 (a.k.a.C 스타일 문자열)을 기대하므로 0 바이트를 제대로 처리하지 못하기 때문에 값은 임의의 2 진 데이터가 될 수 없습니다. 왜 0x9와 같은 제어 문자를 공백으로 변환하는지 모르겠습니다. 아마도 어떤 안전 조치 일 것입니다. – shakurov