다양한 기록

BoF - Countermeasures & 파훼법 본문

운영체제보안

BoF - Countermeasures & 파훼법

라구넹 2024. 12. 4. 23:27

버퍼 오버플로우의 대응책

 

개발자 관점

- 안전한 함수 사용 (strncpy(), strncat())

- 안전한 라이브러리 사용 (libsafe, libmib)

 

OS 관점

- ASLR (Address Space Layout Randomization)

 

컴파일러 관점

- 스택 가드 (스택 카나리)

 

하드웨어 관점

- Non-Executable Stack : NX bit (= DEP, Data Execution Prevention)

* 코드 인젝션은 막는데 리유즈는 못막음


ASLR : 실행할 때마다 주소를 다르게 할당..

현재 스택 프레임의 베이스 포인터 위치(ebp)를 파악하지 못하게 하는 등의 방법

악의적인 코드의 위치 또한 모르게 함

 

ASLR 레벨

0 -> 안바뀜

1 -> 힙 주소는 그대로고 스택은 바뀜

2 -> 대부분의 영역이 랜덤화됨 (코드, 힙, 스택, 공유 라이브러리, 메모리 매핑 영역의 시작 주소)

 

파훼법

32비트 기준이면 가능함, 64비트는 경우의 수가 너무 많아서 조금 어려움

32비트 리눅스에서는 스택이 19비트 사용됨

=> 경우의 수 2^19

언젠가는 같은 주소가 반복됨.. 랜덤화해도 리얼 랜덤은 불가능하기 때문

처음에 찾은 주소가 언젠가 반복이 될 수 있음

=> 될때까지 시도

#!/bin/bash

SECONDS=0
value=0

while [ 1 ]
    do
    value=$(( $value + 1 ))
    duration=$SECONDS
    min=$(($duration / 60))
    sec=$(($duration % 60))
    echo "$min minutes and $sec seconds elapsed"
    echo "The program has been running $value times so far"
    ./stack
done

될때까지 루프 돌리는 쉘 스크립트


스택 가드 (카나리)

스택 주소 기준 버퍼 바로 위쪽에 위치하는게 좋음

void foo(char *str)
{
    int guard;
    guard = secret;
    
    char buffer[12];
    strcpy(buffer, str);
    
    if( guard == secret )
        return;
    else
        exit(1);
}

가드는 임의로 생성된 값이고 시크릿은 안전한 어딘가에 있는 값

버퍼가 넘쳐도 시크릿 값은 변하지 않음

함수 시작 시 가드를 설정하고, 리턴되기 직전에 체크 (세팅 & 체크)

버퍼가 넘치면 제일 먼저 알 수 있음

 

가드로 사용하는 값은 랜덤 넘버가 좋음 (유출 시 공격되기 때문)

위치는 버퍼의 바로 위, 그리고 saved ebp 아래가 좋음

 

만약 고정값을 써야 하는 상황이면 널 값을 사용

공격자가 스택 가드를 유지하는 채로 다른 값만 덮어쓰려는 경우,

결국 스택 가드 위치에 스택 가드 값을 넣어야 하는데 널 값 넣으면

그 위로는 strcpy가 읽는게 불가능 (문자열의 끝으로 인식)


Dash 쉘 파훼

대시 쉘은 ruid랑 euid를 비교해서 다르면 ruid 기반으로 실행함

=> 그러면 쉘코드 실행 전 setuid(0)를 하면 ruid를 루트로 바꿔버림

shellcode = 
    "\x31\xc0"	# xorl	%eax, %eax
    "\x31\xdb"	# xorl	%ebx, %ebx
    "\xb0\xd5"	# movb	$0xd5, %al
    "\xcd\x80"	# int 	$0x80
    ...

eax -> 0xd5 (10진수 213) .. 시스템 콜 번호

ebx -> 0 .. setuid(0) 할 거니까 인자에 0 넣어줌

 

쉘코드 30바이트 + 8바이트만 있으면 대시쉘도 우회 가능


Non-executable stack

= DEP (Data Executable Prevention)

스택에 있는 코드는 실행되지 않도록 하는 기법

 

=> Return To Libc 같은 인젝션을 하지 않는 기법에 의해 우회됨

'운영체제보안' 카테고리의 다른 글

Heap Overflow with code injection  (0) 2024.12.05
Control Hijacking Attack  (0) 2024.12.05
Shellcode  (0) 2024.12.04
Buffer Overflow Attack  (0) 2024.10.22
Set-UID Privileged Program  (0) 2024.10.19