CS/컴퓨터 구조

[컴퓨터 구조](17)[버퍼 오버플로우]

황올뱀 2025. 1. 31. 19:02

버퍼 오버플로우: 할당된 메모리 공간을 넘어 데이터를 쓰는 상황
    배열 범위를 초과하는 데이터 쓰기: A[10]에 길이가 15인 데이터를 쓰면 Bof
    잘못된 입력 검증: 사용자가 예상보다 큰 데이터를 입력한 경우

 

스택 기반 버퍼 오버플로우를 이용한 공격
    너무 큰 데이터를 넣어 데이터 저장 장소에 인접한 메모리까지 침범(리턴 주소 등)할 수 있다
    따라서 공격자는 리턴 주소를 공격자 코드가 있는 곳으로 조작해 공격받도록 한다.
    예) 크기가 40byte인 버퍼에 쓰레기값 40byte, 공격 코드가 있는 곳의 리턴 주소, 공격 코드를 넣어 리턴주소를 덮어쓰고 반환될 때 공격 위치로 가서 공격 실행
    주의사항

  • 공격코드나 리턴주소를 넣을 때, INTEL등의 little endian 메모리 저장 방식을 사용한다면 그에 맞춰서 넣어줘야 됨 (컴퓨터 구조 1 참고)
  • 스택에 공격 코드를 넣을만한 곳이 충분치 않을수도 있음 -> 쓰레기값 넣는 곳에도 코드 넣기
  • 해당 공격 코드가 있는 주소를 알아내기 어려움 -> 0xfffff1234처럼 직접 주소를 제시하는게 아닌 간접적으로 제시 sub $48, %rsp처럼

버퍼 오버플로우 공격 대응 기법

  • 스택 랜덤화 -> ASLR: 공격하려면 공격코드의 주소를 알아야 하는데
    프로그램 실행 때 마다 주소를 랜덤하게 부여해서 알기 힘들게 한다.
        이후 리눅스에서는 ASLR이라는 표준 기법이 되었다.
        Nop sled: 공격 코드의 주소를 바로 알기 어렵다면 그 근처를 찍었을 때 실행되게 하는 방법
              아무 역할도 하지 않고 다음 주소의 명령으로 미끄러지는 nop를 스택에 많이 포함하게 한다. 
              그 이후 아무 위치나 찍었을 때 그곳이 nop라면 쭉 미끄러져 공격코드로 가고 공격 코드가 실행된다.
  • 스택 손상 검출: 스택이 오버플로우가 난 것을 감지해서 보호한다.
    예)스택 사이에 카나리 값을 저장해서 만약 bof로 카나리 값이 손상되었다면 오류를 띄우고 종료하는 방법이다
  • 실행코드 영역 제한: 실행할 코드를 저장하는 공간을 따로 둔다.
    따라서 권한이 없는 공격자는 아예 공격 코드를 쓸 수 없다.
728x90
반응형