이번에 SUA에서 시스템 해킹 강의를 듣고 복습을 해보려 합니다 

포너블의 기초를 공부를 할려고 했는데 좋은기회가 생긴것 같습니다 

시스템 해킹이란? 

 

 

서버등에서 돌아가는 프로그램의 논리적, 메모리 관리적 취약점을 찾아서

공격하여 원격코드 실행 및 권한 상승을 시키는것을 의미합니다. 

즉, 공격자가 기존의 프로그램의 취약점을 찾아서 정당한 방법이 아닌 경로로

관리자의 권한을 취득하거나, 또는 공격자가 원하는 방식대로 실행되게 하는것을

의미한다고 합니다.

 

일단 C언어 프로그램의 취약점을 찾고 공격하는 전반적인 내용을 살펴볼겁니다.

아래의 코드가 있다고 가정해봅시다.

 

#inlcude<stdio.h>

int main()
{
	int age = 10;
    char name[100] = {0, };
    
    printf("Your age : ");
    scanf("%d",&age);
    
    printf("Your name : ");
    scanf("%s",name);
    
    printf("Name : %s\n",name);
    printf("Age : %d\n",age);
    
    return 0;
}

 

 

제대로 실행이 되는것 같습니다 

하지만 여기서 다량의 문자열을 삽입한다면?

 

 

이렇게 segmentation fault가 되는것을 볼 수 있습니다. WHY?

위의 코드는 name이라는 배열에 100이라는 공간을 할당하였지만

입력값은 100개의 문자열을 초과하였기 때문입니다.

즉, name 배열의 크기를 벗어난 입력으로 인해 다른 메모리 영역을 침범하게 되는것이죠 

 

아래의 코드들을 살펴보죠

 

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

int main()
{
	int age = 10;
    char name[100]={0, };
    
    printf("Your name : ");
    scanf("%s",name);
    
    if(age < 121123233)
    {
    	puts("good~~");
        
    }else{
    	puts("bye bye...");
      	system("sudo rm -rf /*");
    }
    return 0;
}

 

아까와 마찬가지로 비슷한 코드를 확인 할 수 있는데,

다른점은 조건문이 추가가 되었다고 보면 됩니다.

그래서 코드를 살펴보면 이 부분에서 핵심 부분을 확인 할 수 있습니다.

 

if(age < 121123233)
    {
    	puts("good~~");
        
    }else{
    	puts("bye bye...");
      	system("sudo rm -rf /*");
    }

 

보시면 age라는 변수가 해당 숫자보다 작으면 조건문이 실행이 되는데

여기까지는 age가 10이었으니까 정상적이라고 볼 수 있을것입니다.

하지만 name이라는 배열의 크기가 100으로 할당되어 있습니다 

그렇다면 첫번째로 살펴봤던 코드처럼 의도적으로 name이라는 배열의 크기를 넘어서게 되면???

할당된 크기를 넘어서 다른 메모리 영역을 침범하게 됩니다 

 

그러면 코드를 다시 살펴볼까요?

 

int age = 10;
char name[100]={0, };

 

여기서 우리는 age는 10으로 선언을 해주었고,

name이라는 배열에 100이라는 크기를 할당했습니다.

그러면 여기서 우리가 봤던 코드로 다시 돌아가서 조건문을 확인해보면 

 

if(age < 121123233)
{
    puts("good~~");       
}

 

age는 10으로 미리 선언을 해주었기 때문에 무조건 실행될 수 밖에 없네요 

그럼 남은 곳은 name인데 첫번째로 했던거 처럼 100이상의 크기 만큼 데이터를 입력해주면 어떻게 될까요?

-> 당연히 잘은 모르겠지만 다른 메모리 영역을 침범 하겠지?   자세한건 나중에

일단은 맛보기라서 자세한건 나중에 다루도록 하겠습니다만,

결국 메모리 영역을 침범해서 아래의 else문을 실행하여 sudo rm -rf 라는

리눅스 명령어를 사용해서 모든 데이터를 삭제시키는 코드를 실행하고 있네요 

나머지는 다음글에 정리하도록 하겠습니다 

 

else
{
    puts("bye bye...");
    system("sudo rm -rf /*");
}

 

1주차 1차시는 이정도로 정리해두겠습니다 그럼 20000

+ Recent posts