터미널 입력 버퍼에 남겨진 폭탄을 조심해라!
#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, 바로 이 터미널의 데이터를 읽는 것입니다.
그러나 a.out은 1글자만 읽고 나머지 bc는/dev/pts/0의 입력 버퍼에 남는다. abc를 입력할 때 버퍼에 3글자가 있고 리턴을 눌렀을 때 입력 버퍼에는 4글자가 있다.'a','b','c','\CR'이다. 다음 일이 발생했다.
만일 당신이 입력한:arm-rf/라면...
따라서 프로그램의 마지막 부분에서 입력 버퍼를 비우는 것을 잊지 마세요.
int c
while ((c = getchar()) != '
' && c != EOF);
절강성 온주는 구두가 젖어서 비가 오면 물에 들어가도 살이 찌지 않는다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.