Nice programing

argc가 오버플로 될 수 있습니까?

nicepro 2020. 10. 19. 12:45
반응형

argc가 오버플로 될 수 있습니까?


나는 방황하고 있었고이 질문을 보았다 . 그런 다음 argc를 오버플로 할 수 있는지 궁금해하기 시작했습니다.

Standard는 argv[argc]null 포인터 여야하지만 argc가 오버플로되면 false가됩니다.

(내가 작은 C 프로그램과 테스트 만 가지고하는 파이썬 스크립트를 MemoryError.)

감사!


국제 표준의 근거 — 프로그래밍 언어 — C §5.1.2.2.1 프로그램 시작

광범위한 사전 관행 인식하기 위한 인수 argc의 사양 . 또한 일반적인 관행을 기반으로 목록 끝에 대한 중복 검사를 제공하려면 null 포인터 여야합니다.argvmainargv[argc]


표준에 따라

따라서 귀하의 견적에서 :

argv[argc] 널 포인터 여야합니다.

따라서 argc위의 진술이 사실이 아니기 때문에 오버플로 할 수 없습니다.

실제로

실제로 프로그램에 전달되는 인수의 총 크기는 제한됩니다.

내 Linux / x64 시스템에서 :

$ getconf ARG_MAX
2097152

따라서 총 인수 크기는 약 2MB이며 argc오버플로 할 수 없습니다. 이 제한은 전체 데이터 argv와 환경 의 조합을 측정한다고 생각 합니다. 명령을 실행하려고 할 때이 제한을 초과하면이 ( exec()가) 실패하고 E2BIG. 에서 man 2 execve:

E2BIG 환경 (envp) 및 인수의 총 바이트 수
       목록 (argv)이 너무 큽니다.

내 시스템의 ~ 2MB 제한은 다른 시스템에 비해 상대적으로 관대하다고 생각합니다. 내 OS X 시스템이 최대 260KB로보고됩니다.

하지만 ARG_MAX정말 크다면 어떨까요?

좋아요, 당신이 오래되고 이상한 시스템에 있다고 가정 해 봅시다. int16 비트이고 ARG_MAX는 2 15를 훨씬 넘습니다 . 그렇지 않으면 상당히 합리적입니다. 이제 execve()2 개 이상의 15 개 인수 를 사용하여 호출한다고 가정합니다 . 구현에는 두 가지 옵션이 있습니다.

  1. argc오버플로 를 허용 할 수 있습니다 . 기본적으로 데이터를 버리고 실행중인 프로그램이 예상치 못한 잘못된 방식으로 실행되도록하고 C 표준을 위반합니다. 무엇보다도 오류가 조용하기 때문에 모를 수도 있습니다.

  2. 또는 단순히 반환 할 수 EOVERFLOW에서 execve()단순히 많은 매개 변수를 사용하여 이미지를 실행할 수 있음을 알리는. 이제 POSIX / SUS 표준은이 오류 결과에 대해 언급하지 않지만, 이는 단순히 표준 작성자 ARG_MAXINT_MAX.

옵션 # 2는 유일한 합리적인 옵션입니다. 시스템이 어떻게 든 옵션 # 1을 선택 하면 고장난 것이므로 버그 보고서를 제출해야합니다.

또는 16 비트 시스템 용으로 컴파일 된 이전 프로그램을 실행하려고 할 수 있지만 일종의 에뮬레이터 또는 호환성 계층을 통해 실행하고 있습니다. 프로그램에 2 15 개 이상의 매개 변수를 전달하려고하면 에뮬레이터 또는 호환성 계층에서 오류 메시지가 표시 될 것으로 예상합니다 .


실제로는 할 수 없습니다. 대부분의 시스템은 argv의 총 결합 크기에 상대적으로 낮은 제한을 둡니다 envp. 수십에서 수백 KB까지의 제한은 드문 일이 아닙니다. 다양한 OS에 대한 제한에 대한 합리적으로 포괄적 인 목록 http://www.in-ulm.de/~mascheck/various/argmax/참조 하십시오 .


나는 이것을 시도했다 :

test.c :

 ⚡⚡⚡  more test.c 
#include <stdio.h>
int main(int argc, char **argv)
{
    printf("argc = %d\n", argc);
    printf("Size of argc = %d\n", sizeof(argc));
    return 0;
}

그런 다음 큰 zip 파일을 사용했습니다.

 ⚡⚡⚡  ls -h bigfile 
-rw-r--r-- 1 ehwas ehwas 355M Jan 22 16:54 bigfile

그런 다음 파일을 테스트 프로그램의 매개 변수로 읽습니다.

⚡⚡⚡  ./test $(more bigfile)

결과:

5 minutes nothing happend, then everything froze

그런 다음 더 작은 파일을 시도했습니다.

 ⚡⚡⚡  ls -h notsobigfile 
-rw-r--r-- 1 ehwas ehwas 6.7M Jan 22 17:04 notsobigfile

과:

 ⚡⚡⚡  ./test $(more notsobigfile)
bash: ./test: Argument list too long

As indicated by the standard, argv[argc] must be a valid value.

So if the run-time environment is in a situation such that it cannot guarantee that, it should not start the program.

참고URL : https://stackoverflow.com/questions/28075323/can-argc-overflow

반응형