[정보 보안 개론] 코드 보안(프로그램과 코드 보안[프로그램 실행 구조-1])

Jin_Hahha·2024년 10월 21일
0

정보 보안 개론

목록 보기
15/17
post-thumbnail

시스템 구성과 프로그램 동작

프로그램과 코드 보안

  • 프로그래머는 C, C++, 자바 등의 언어를 사용하여 응용 프로그램이나 운영체제 등을 위한 소스 코드 작성
  • 해커가 프로그래머의 여러 프로그램을 분석하여 악용하는 경우가 많음
  • 웹 해킹도 웹 소스 코드를 악용하기 때문에 가능한 일
  • 해당 파트는 EXE, DLL, COM과 같은 실행 파일 형태로 동작하는 프로그램의 보안 코드 학습
  • 대표적인 공격은 버퍼 오버플로와 포맷 스트링
    • 이해하기 쉬운 개념이 아님
    • 시스템의 구성과 동작 원리를 기본적으로 알아야 하기 때문
  • 하드웨어, 어셈블리어, 소스 코드를 구분하여 이해해야 함
    • 위의 세 개의 영역 중 가장 취약점이 쉽게 발생하는 영역은 소스 코드 영역
    • 하드웨어는 기계적 문제점 이외의 취약점은 잘 발생하지 않음
    • 어셈블리어는 매우 단순한 명령 집합, 그 자체에 보안 취약점이 있다고 할 수 없음
  • 소스 코드에서 문제를 발생시키는 요인은 데이터의 형태와 길이에 대한 불명확한 정의로 집약할 수 있음

시스템 메모리의 구조

  • 시스템 메모리의 기본 구조는 아래와 같음

  • 어떤 프로그램을 동작시키면 프로그램이 동작하기 위한 가상 공간이 메모리에 생성됨

  • 이 메모리 공간은 목적에 따라 상위, 하위 메모리로 나뉨

    • 상위 메모리에는 스택(stack) 할당
    • 하위 메모리에는 힙(heap) 할당

스택 영역과 힙 영역

  • 스택 영역은 프로그램 로직이 동작하기 위한 인자(argument)와 프로세스 상태를 저장하는 데에 사용
  • 힙 영역은 프로그램이 동작할 때 필요한 데이터 정보를 임시로 저장하는 데에 사용
  • 스택은 레지스터의 임시 저장, 서브루틴 사용 시 복귀 주소(return address) 저장, 서브루틴 인자 전달 등에 사용
    • 상위 주소에서 하위 주소 방향으로 사용
    • 후입선출(Last In First Out, LIFO) 원칙에 따라 나중에 저장된 값을 우선적으로 사용
    • 스택의 동작을 이해하려면 CPU의 임시 메모리인 레지스터에 대해서도 알아야 함
  • 힙은 프로그램이 실행될 때까지 알 수 없는 가변적인 양의 데이터를 저장하기 위해 프로그램 프로세스가 사용할 수 있도록 미리 예약된 메인 메모리의 영역
    • 프로그램에 의해 할당되었다가 회수되는 작용이 되풀이
    • 프로그램이 요구하는 블록의 크기나 요구, 횟수 순서에 일정한 규칙이 없음
    • 힙의 기억 장소는 대개 포인터 변수를 통해 동적으로 할당받고 돌려줌
    • 연결 목록, 나무, 그래프 등의 동적 데이터 구조를 만드는 데 반드시 필요
    • 프로그램 실행 중에 해당 힙 영역이 없어지면 메모리 부족으로 이상 종료됨

레지스터

  • CPU의 임시 메모리
  • CPU 연산과 어셈블리어 동작에 필요
  • 80x86 CPU는 프로그램 동작을 위해 아래와 같은 레지스터 제공


  • ESP, 16비트의 레지스터인 SP(stack pointer)에 E(extended)를 추가한 것
    • 프로세서가 32비트로 커지면서 extended라는 의미를 표현하기 위해 E가 추가된 것
    • 기본 역할은 SP와 동일
  • EBP, BP에 E를 붙인 것
  • 많은 PC가 64비트 CPU로 바뀌면서 EAX는 RAX로, EBX는 RBX로 바뀜
  • E 문자열이 R로 바뀌고, 32비트 레지스터가 64비트 레지스터로 바뀌어 레지스터의 크기가 커짐
  • 레지스터의 기본 용도나 의미는 바뀌지 않음

프로그램 실행 구조

  • 위의 프로그램은 C로 작성된 예시 프로그램
  • main 함수와 덧셈을 하는 서브루틴인 function이 있는 프로그램
  • C로 작성된 프로그램을 어셈블리어 파일로 전환하면 아래와 같이 출력됨

  • 오른쪽에 붙은 번호순으로 실행됨
  • 앞 부분은 main 함수에 대한 내용
  • 중반부터는 function 함수에 대한 내용

  • push, add, mov 옆에 있는 l은 피연산자의 크기를 나타냄
  • l(long)은 32비트, w(word)는 16비트, b(byte)는 8비트를 의미
  • 보통 mov와 movw가 같음
  1. pushl %ebp
    • 처음 main 함수가 시작되면 main 함수의 EBP(extended base pointer) 레지스터 값을 스택에 저장
    • EBP 레지스터에는 스택에서 현재 호출되어 사용되는 함수의 시작 주소 값이 저장되어 있음
    • 함수 실행과 관련된 지역변수 등을 참조할 때 기준이 됨
    • 스택에 저장된 EBP는 SFP(saved frame pointer)라고 함
    • 위의 어셈블리어 코드에는 나타나지 않았지만 EBP 바로 앞에 RET(Return address)가 저장됨
    • RET에는 함수 종료 시 점프할 주소 값이 저장됨

0개의 댓글