버퍼 오버플로우: 할당된 메모리 공간을 넘어 데이터를 쓰는 상황
배열 범위를 초과하는 데이터 쓰기: A[10]에 길이가 15인 데이터를 쓰면 Bof
잘못된 입력 검증: 사용자가 예상보다 큰 데이터를 입력한 경우
스택 기반 버퍼 오버플로우를 이용한 공격
너무 큰 데이터를 넣어 데이터 저장 장소에 인접한 메모리까지 침범(리턴 주소 등)할 수 있다
따라서 공격자는 리턴 주소를 공격자 코드가 있는 곳으로 조작해 공격받도록 한다.
예) 크기가 40byte인 버퍼에 쓰레기값 40byte, 공격 코드가 있는 곳의 리턴 주소, 공격 코드를 넣어 리턴주소를 덮어쓰고 반환될 때 공격 위치로 가서 공격 실행
주의사항
- 공격코드나 리턴주소를 넣을 때, INTEL등의 little endian 메모리 저장 방식을 사용한다면 그에 맞춰서 넣어줘야 됨 (컴퓨터 구조 1 참고)
- 스택에 공격 코드를 넣을만한 곳이 충분치 않을수도 있음 -> 쓰레기값 넣는 곳에도 코드 넣기
- 해당 공격 코드가 있는 주소를 알아내기 어려움 -> 0xfffff1234처럼 직접 주소를 제시하는게 아닌 간접적으로 제시 sub $48, %rsp처럼
버퍼 오버플로우 공격 대응 기법
- 스택 랜덤화 -> ASLR: 공격하려면 공격코드의 주소를 알아야 하는데
프로그램 실행 때 마다 주소를 랜덤하게 부여해서 알기 힘들게 한다.
이후 리눅스에서는 ASLR이라는 표준 기법이 되었다.
Nop sled: 공격 코드의 주소를 바로 알기 어렵다면 그 근처를 찍었을 때 실행되게 하는 방법
아무 역할도 하지 않고 다음 주소의 명령으로 미끄러지는 nop를 스택에 많이 포함하게 한다.
그 이후 아무 위치나 찍었을 때 그곳이 nop라면 쭉 미끄러져 공격코드로 가고 공격 코드가 실행된다. - 스택 손상 검출: 스택이 오버플로우가 난 것을 감지해서 보호한다.
예)스택 사이에 카나리 값을 저장해서 만약 bof로 카나리 값이 손상되었다면 오류를 띄우고 종료하는 방법이다 - 실행코드 영역 제한: 실행할 코드를 저장하는 공간을 따로 둔다.
따라서 권한이 없는 공격자는 아예 공격 코드를 쓸 수 없다.
728x90
반응형
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조](19)[캐시 구조 & 원리] (0) | 2025.02.13 |
---|---|
[컴퓨터 구조](18)[공간 지역성과 캐시] (0) | 2025.02.12 |
[컴퓨터 구조 번외](2)[어셈블리 문제 풀어보기 2] (0) | 2025.01.30 |
[컴퓨터 구조 번외](1)[어셈블리 문제 풀어보기 1] (0) | 2025.01.29 |
[컴퓨터 구조](16)[어셈블리어 7] (0) | 2025.01.28 |