본문 바로가기

드림핵

[드림핵 System Hacking Fundamental] Stage 5

이전 포스팅에 이어 계속 공부한 내용을 정리해본다.

 

Stage5. Stack Buffer Overflow

이전까지는 기초지식과 툴 사용법을 익혔다. 이제 처음으로 공격기법을 공부하기 시작했다.

공부하면서 기초지식과 툴 사용법을 익히는 과정이 매우 중요했다는 것을 느낄 수 있었다.

 

Stage5-1. Calling Convention

  • 함수 호출 규약(Calling Convention)
    • 함수의 호출 및 반환에 대한 약속
    • Caller(호출자), Callee(피호출자)가 있음
    • 함수 호출 규약의 종류:  SYSV(x86-64아키텍처), cdecl(x86아키텍처) 등
  • SYSV의 특징
    • 6개의 인자를 rdi, rsi, rdx, rcx, r8, r9에 순서대로 저장하여 전달하며, 더 많은 인자를 사용할 때는 스택을 추가로 이용.
    • Caller에서 인자 전달에 사용된 스택을 정리함.
    • 함수의 반환값은 rax로 전달
    • 함수 호출 규약 순서
      1. 인자 전달
      2. 반환 주소 저장
      3. Caller의 스택 프레임 저장
      4. Callee에게 스택 프레임 할당
      5. 반환값 전달
      6. Callee의 스택 프레임 해제
      7. 반환

 

Stage5-2. Stack Buffer Overflow

  • Stack Overflow VS Stack Buffer Overflow
    • Stack Overflow는 스택 영역 자체가 넘친 것
    • Stack Buffer Overflow는 스택 영역 안에 할당된 특정 버퍼가 넘친 것
  • 버퍼란?
    • 데이터가 목적지로 이동하기 전에 보관되는 임시 저장소
    • 데이터 처리 속도가 서로 다른 두 장치 사이에서 완충 작용을 함
    • 현대에는 데이터가 저장될 수 있는 모든 단위를 버퍼라고 칭함
  •  Stack Buffer Overflow 공격의 유형 3가지
    • 중요 데이터 변조: 다른 버퍼의 데이터 덮어쓰기
    • 데이터 유출: 다른 버퍼의 데이터까지 읽어버리기(Data leak)
    • 실행 흐름 조작: return 주소 덮어쓰기
  •  Stack Buffer Overflow 취약점이 있는 함수들(입력값의 길이 체크를 안 함)
    • scanf()
    • strcpy()
    • strcat()
    • sprintf()
    • gets()
  •  Stack Buffer Overflow 예방을 위해 입력값의 길이 체크를 하는 함수들
    • strncpy()
    • strncat()
    • snprintf()
    • fgets()
    • memcpy()