프로그래밍

 3198, 1/160 회원가입  로그인  
   nsh009
   인증 소스코드 질문

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3164 [복사]


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
      
      int auth=0;
      char passwd[20];
      
      printf("패스워드를 입력하세요:");
      gets(passwd);
      
      if(strcmp(passwd, "korea")==0)
                        auth=1;
                        
                        if(auth)
                        printf("축하합니다 인증에 통과하였습니다!\n");
                        
                        else
                        
                        printf("인증에 실패하였습니다.\n");
                        
                        system("pause");
}


버퍼오버플로우 강좌 보고 dev 로 옮겨 놓은 코드 인데요..

저기 if 문에 passwd 입력받은 값과 korea 를 비교 하는 부분이있잖아요?

어떻게 해석해야 되나요?  아래 auth 는 왜 갑자기 1 이 되는건지..

그리고 if(auth) 이것만으로도 출력을 할수 있나요? 어떠한 비교 값이 들어가야 되는거 아닌가요..?

제가 풀어본 바로는 해답은 21개 이상의 문자를 입력하면 인증에 통과하는건데.. 원리좀 자세히 알려주실분..

친구한테 물어보니.. 스택 문제 라는데 - _-;; 자세히 보니 그건 아닌거 같고.. 버퍼오버플로우 가 맞긴한데..

  Hit : 4719     Date : 2011/09/18 01:17



    
windowhan strcmp라는 문자열조작함수가 있네요.그 함수로 if문을 사용해서 두개의 문자열을 비교해서 같으면 auth에 1을 대입해라 이말이에요. if(auth)는 auth가 참인지 거짓인지를 판별하구요.
그런데 if문에선 대상이 0만 아니라면 무조건 참이 되요.(컴퓨터가 판별하는 기준)
즉, 1이나 -1 혹은 100이나 -100은 모두 참에 해당한다.라는 뜻입니다.

c언어를 공부하셨으면 아시겠지만, int는 4바이트입니다. 때문에 배열이 auth[3]까지 있게됩니다.

틀린점있으시면 꼬집어주세요
2011/09/18  
늅늅 windowhan//
int형배열은 int형 변수들의 집합이라
int auth[3]; 같은경우에는 12바이트가 할당됩니다.


들여쓰기를 좀 잘못하신거같은데요
들여쓰기를 잘못한다고 프로그램이 에러가 나진않지만
가독성에 문제가 생겨요
주석 달아드릴게요

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{

int auth=0; //우선 인증이 됬는지 안됬는지를 구분하는 변수. 0이면 인증안됨
//1 이면 인증됨
char passwd[20]; //패스워드를 저장할 배열이네요.

printf("패스워드를 입력하세요:");
gets(passwd); //패스워드 변수에 문자열을받아 배열형태로 저장합니다.

if(strcmp(passwd, "korea")==0) // passwd변수와 "korea"라는 문자열을 비교하여 0이 리턴될
// 경우, 즉 두 인자가 같은 값일 경우에는
auth=1; // 인증에 성공했다고 판단하여 인증변수를 1로 설정합니다.

if(auth) // if(1) 은 실행, if(0)은 실행X (보통의 상황에서 1은 True
// 0 은 False를 의미합니다.
printf("축하합니다 인증에 통과하였습니다!\n"); //인증에 성공하였다는 메시지
//를 출력합니다.

else //인증에 실패하였을경우에는

printf("인증에 실패하였습니다.\n"); //마찬가지로 인증에 실패하였다는 메시지
//를 출력합니다.

system("pause");
}
2011/09/18  
늅늅 아 그리고 패스워드 변수에 20개 이상을 집어넣었을때 통과하는 이유는
C언어가 컴파일 되면서 변수가 메모리에 쌓이는 순서는
선언된순서가 아닌 역순입니다.
따라서 패스워드변수 다음에 auth변수가 오게되며
패스워드변수는 20바이트이므로 20바이트를 모두 채운뒤에도 문자열이 남으면
자연스럽게 오버플로우되어 auth변수로 나머지가 넘어갑니다
0이 아니면 모두 참이므로 마지막에 입력하는게 0이 아니면 if(auth) 문에 참이되어 통과하게됩니다
2011/09/18  
늅늅 스택문제가 맞겠지요.. 2011/09/18  
nsh009 어잌후야 두분다 감사합니다.. 늅늅님 말씀들으니깐 이해가 한번에 되는군요! 2011/09/18