[정의] 힙 데이터 영역에서 발생하는 버퍼 오버플로의 한 종류로, 동적 메모리 할당 연결(malloc 메타 데이터 같은)을 겹쳐쓰고 프로그램 함수 포인터를 겹쳐쓰기 위해 결과로 나온 포인터를 교환하는 기법.

 

[개념] 프로그램이 실행되면, 실행에 필요한 정보들이 메모리 영역에 올라가는데 크게는 코드 영역, 데이터 영역, 스택 영역, 힙 영역 으로 구분.
- 코드영역 : 프로그램의 코드가 올라가는 영역, 여기서코드란, 컴파일된 기계어코드
- 데이터영역: 전역변수와 정적변수등이 할당되는영역. 초기화된 데이터는 data 영역에 저장. 초기화 되지 않은 데이터는 bss 영역에 저장
- 스택영역 : 지역변수와 매개변수가 저장되는 영역
- 힙영역 : 빈공간, 필요에 의해 메모리를 할당 및 해제(컴파일러가 예측 할 수 없는, 프로그래머가 관리하는 영역)


[스택 대신 힙영역 사용이유]
- 동적할당, 컴파일시기에 크기를 알수없는 데이터, 컴파일할때는크기를 알지 못하다가, 프로그램이 실행되었을때 크기가 결정되는 경우에 사용


[원리] Heap 영역의 낮은 주소에 있는 버퍼가 넘쳐서 다른 버퍼를 침범하여 발생

 

 

 


[예시] 


1) 두 개의 heap 메모리인 input과 secret을 할당한 뒤, secret 파일을 읽어서 두 번째로 할당했던 secret 영역에 저장
2) 그 후 input 영역에 입력 값을 받고 출력시켜주는 간단한 코드
3) 취약점은 read 함수, input으로 할당한 메모리 크기는 40 바이트이지만
read 함수를 통해 최대 100 바이트까지 입력할 수 있어 Heap Overflow 가 발생
4) Heap Overflow를 이용해서 secret 에 할당된 메모리 영역의 직전까지 데이터를 채워주면,
문자열이 연결되어 printf 함수가 secret 메모리의 값까지 출력 됨.
5) 40 바이트 만큼 할당 한다면 input 에 할당된 메모리와 secret 에 할당된 메모리의 거리차이는 40 바이트
6) 40 바이트를 할당한다고 해서 딱 40 바이트만 할당되는 것은 아니고
메모리의 할당과 해제를 관리하기 위한 정보들이 함께 들어가기 때문에 실제 할당되는 사이즈는 조금 늘어나게 됨.
그래서 문자열의 길이를 조금 늘려주면 Heap Overflow 를 이용한 Leak 이 가능
7) 만약 뒤쪽에 함수 포인터가 존재한다면 그 부분을 조작하여 프로그램의 실행 흐름을 변조도 가능

 

 

 

'ITPE > 보안' 카테고리의 다른 글

예방, 탐지, 저지, 교정  (0) 2025.01.17
보안특징 (CIA)  (0) 2025.01.17
Buffer Overflow 공격  (0) 2021.04.01
IP Spoofing  (0) 2021.04.01
Slack Space 분석  (0) 2021.03.30

 

 

 

[정의] 루트권한 SUID 프로그램 실행 시 버퍼 초과 데이터를 입력, 비정상 작동에 의한 복귀주소를 조작, 공격 Shell을 실행시키는 공격 기법.


[개념] 사용자가  프로그램에서 저장을 위해 할당한 것보다 더 많은 데이터를 입력하려는 시도.


[유형] 
-Local Buffer Overflow : 루트권한 프로그램 취약점 이용
-Remote Buffer Overflow : RPC, FTPD 서비스 취약 이용


[버퍼 오버플로우의 불안전한 코드 사례]

불안전한 코드 안전한 코드
void manipulate_string(char* string) {
   char buf[24];
strcpy(buf, string);
}}
 void manipulate_string(char* string) {
char buf[24];
/* 복사하려는 buf와 길이를 비교. */
if (strlen(string < sizeof(buf))
strncpy(buf, string, sizeof(buf)-1);
/* 문자열은 반드시 null로 종료 */
buf[sizeof(buf)-1] = '₩0';
……
 }
매개변수로 받은 문자열 크기가 지역버퍼에 복사가 되는지 확인하지 않고 strcpy() 함수를 이용 데이터를 복사 매개변수로 받은 변수와 복사하려는 buf의 크기를 비교하여 buf의 크기를 제한하고 마지막 문자에‘₩0’을 삽입


[사례] 

#include <stdio.h>

void sample_function ( char* string )

{

         char buffer[16];

         strcpy (buffer, string);

         return;

}

void main()

{

         char big_buffer[256];

         int i;

         for (i=0; i<256; i++)

                 big_buffer[i] = 'A';

                 sample_function (big_buffer);        // 큰 버퍼를 함수에 보냄

}

}


- 버퍼 오버플로우를 일으키고 운영체제의 스택이 크래시되게 하여 특정 코드가 실행되게 함.

 

 

 


[공격 종류] 
-서비스 거부 공격: 메모리 스택에 많은 데이터를 대입하여 발생. 운영체제 데이터와 같은 중요한 정보를 덮어 써서 시스템 운영체제가 기능을 수행하지 못하게 함.
-접근 권한 획득: 스택에 적당한 크기의 정보를 입력하여 복귀 포인터를 덮어씀. 원래 실행되어야할 코드 대신 자신의 코드를 가리켜 실행시킴. 패스워드 해쉬 값을 출력하거나, 새로운 계정을 생산하는 것등을 할 수 있음.


[대응방안] 스택 영역 실행/쓰기제한 및 무결성 검사. 프로그램/서버의 신속한 패치, 보안 OS 도입, 시큐어코딩.

 

 

기본 예제 (위키피디아)

아래의 예제에서, 프로그램은 메모리에서 인접해 있는 두 아이템을 정의하였다: 8 바이트 길이 스트링 버퍼, A. 그리고 2 바이트 정수형, B. 우선, A 는 8바이트 모두 숫자 0값만 포함하고 B는 숫자 3을 포함한다. 문자들은 1바이트 크기이다.

A B
0 0 0 0 0 0 0 0 0 3

이제, 프로그램은 문자열 "excessive"를 A 버퍼에 저장한다. 한 바이트짜리 0값이 스트링의 끝임을 알리기 위해 따라온다. 스트링의 길이를 확인하지 않음으로 B의 값을 덮어쓴다.

A B
'e' 'x' 'c' 'e' 's' 's' 'i' 'v' 'e' 0

비록 프로그래머가 B가 바뀌는 것을 전혀 의도하지 않았다 하더라도, B의 값은 문자열의 한 부분을 구성하는 숫자로 바뀌었다. 이 예제에서 ASCII를 사용하는 빅 엔디언 시스템에서 "e" "0"는 숫자 25856가 될 수 있다. B가 프로그램이 정의한 유일한 다른 변수였다면, B의 끝을 지나가는 긴 스트링을 쓰는 것은 세그멘테이션 오류, 프로세스 종료와 같은 오류를 발생시켰을 것이다.

 

 

 

'ITPE > 보안' 카테고리의 다른 글

보안특징 (CIA)  (0) 2025.01.17
Heap Overflow  (0) 2021.04.01
IP Spoofing  (0) 2021.04.01
Slack Space 분석  (0) 2021.03.30
DNSSEC  (0) 2021.03.28

 

 

 

[정의] 공격자가 자신의 IP address를, 공격하고자 하는 네트워크의 호스트 IP Address로 바꾸어 IP 기반의 인증을 무력화 시키는 공격.

 

 

[절차]

 

Target System과 Client는 신뢰관계 형성 (ID, PW없이 접근).
IP Protocol 취약점을 습득하기 위해서는 Sniffing 공격이 선행(Seq Number 획득)

 

 

 

 

 

1.공격자는 클라이언트에 TCP SYN Flooding 공격 (rsh,rlogin)

2.공격자는 클라이언트의 IP로 속여 서버에 연결.
3.서버는 SYN/ACK 패킷을 보내고 클라이언트는 TCP SYN Flooding
공격때문에 연결이 이뤄지지 않고 서버 패킷은 사라지게 된다.(미확인)
4.공격자는 서버에 ACK 패킷을 보낸것처럼 속이면서,
IP Spoofing 명령어가 들어있는 패킷을 보내 신뢰 관계에 있는
클라이언트라고 속이면 연결이 이루어지게 된다.


[대응방안]
- 외부에서 들어오는 패킷중에서 출발지 IP 주소(Source IP Address)에
내부망 IP 주소를 가지고 있는 패킷을 라우터 등에서 패킷 필터링을 사용하여 방어.
- 내부사용에 의한 공격은 막을 수 없으므로 각 시스템에서 TCP Wrapper, ssh 설치 운영하고
rsh rlogin 등과 같은 인증과정이 없는 서비스는 미사용.
- IP Spoofing TCP/IP 설계와 구현의 문제이므로 새 프로토콜을 사용하지 않는 이상
완벽한 보호대책은 존재할 수 없으므로 지속적인 관리와 점검필요.

 

 

 

'ITPE > 보안' 카테고리의 다른 글

Heap Overflow  (0) 2021.04.01
Buffer Overflow 공격  (0) 2021.04.01
Slack Space 분석  (0) 2021.03.30
DNSSEC  (0) 2021.03.28
IPSec(IP Security)  (0) 2021.03.28

+ Recent posts