터미널 입력 버퍼에 남겨진 폭탄을 조심해라!

3782 단어
프로그램 보기:
#include 

int main (int argc, char **argv)
{
	char buf[1];

	//syscall(0, 0, buffer, 1);
	read(0, buf, sizeof(buf));
	printf("buf is: %s
"
, buf); return 0; }

나는 버퍼 넘침은 말할 것도 없고, 각종 빈틈과도 무관하다. 내가 말하는 것은 단지 하나의 조작 습관, 또는 프로그래밍 습관 문제일 뿐이다.
질문, abc를 입력하면 무슨 일이 일어날까요?
정답 보기:
[root@localhost ]# ./a.out
abc
buf is: a
[root@localhost ]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
^C
(interrupt) Exiting bc.

Why??
간단합니다. 프론트 데스크톱 bash 프로세스가 exec에서 a.out을 받은 후에 터미널/dev/pts/0 (또는 다른 것) 을 a.out,read (0, 바로 이 터미널의 데이터를 읽는 것입니다.
  • bash와 a.out은 공용/dev/pts/0입니다!

  • 그러나 a.out은 1글자만 읽고 나머지 bc는/dev/pts/0의 입력 버퍼에 남는다. abc를 입력할 때 버퍼에 3글자가 있고 리턴을 눌렀을 때 입력 버퍼에는 4글자가 있다.'a','b','c','\CR'이다. 다음 일이 발생했다.
  • a.out은 1문자 a를 읽고 인쇄 후 종료합니다.
  • bash는 버퍼에'b','c','\CR'세 글자가 있는 것을 발견했다.
  • bash는 bc 명령을 실행합니다.

  • 만일 당신이 입력한:arm-rf/라면...
    따라서 프로그램의 마지막 부분에서 입력 버퍼를 비우는 것을 잊지 마세요.
    int c
    while ((c = getchar()) != '
    '
    && c != EOF);

    절강성 온주는 구두가 젖어서 비가 오면 물에 들어가도 살이 찌지 않는다!

    좋은 웹페이지 즐겨찾기