[시스템해킹] Buffer OverFlow(BOF)

sheiskone·2022년 10월 4일

시스템해킹

목록 보기
5/6

BOF 개념

  1. 함수 호출 과정
  • 함수 호출 규약이 아키텍처, 컴파일러 환경에 따라 달라짐
    1. 인자 전달 - 먼저 레지스터에 저장하고, 부족하면 스택에 저장
    2. return 주소 저장 - call func 함수 호출 다음 수행할 명령어의 주소(return 주소)를 스택에 push

    (함수 내부)
    3. 스택 프레임 저장 - push rbp main의 Stack Frame Pointer(SFP)를 스택에 push
    4. 스택 프레임 할당 - mov rbp, rsp/sub rsp, 0x30 함수에서 사용할 새로운 스택 프레임 할당, 새로 할당 받은 스택프레임에서 연산 수행.

    5. 스택 프레임 해제 - leave 함수 연산을 마친 후 이전의 스택 프레임으로 돌아가기
    6. 반환 값 저장 - 함수 반환 값을 rax에 저장

    7. 반환 - ret return 주소를 꺼내서 main 함수로 복귀
  1. Stack Buffer OverFlow
  • 버퍼: 데이터가 목적지로 이동하기 전에 보관되는 수신-송신 사이 임시 저장소
  • BOF: 버퍼가 넘치는 것. 버퍼의 크기보다 데이터가 많이 들어가면 다른 영역의 값을 오염시킴.
  • Stack BOF: 스택 영역의 버퍼에서 Overflow 발생
  • Stack BOF 예시: 중요 데이터 변조, 데이터 유출, 실행 흐름 조작 등 공격 가능
  • Stack BOF 취약점: 버퍼에 사용자 입력을 받으면서 길이를 체크하지 않는 함수.
    ex) scanf("%s", buf), strcpy, strcat, sprint, read 등
  1. NOP sled (NOP slid)
  • NOP: 아무것도 수행하지 않는 명령어(No Operation). 다음 명령어로 넘어감
  • NOP Sled: 셸코드의 정확한 주소를 알 수 없을 때 셸코드 주소의 범위를 크게 만들기 위해 사용하는 기법
    ex) ASLR 기법으로 인해 메모리 주소가 계속 변경되는 경우
  • 셸코드 앞에 NOP 명령어를 길게 나열하면 NOP가 있는 아무 주소에만 도착하면 NOP를 타고 내려가 결국 셸코드를 실행하게 됨

0개의 댓글