일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 배경 그림
- MLFQ
- RBAC
- dtft
- MAC
- Unity #Indie Game
- 운영체제
- TSet
- 게임개발
- pdlc
- DSP
- linear difference equation
- CTF
- Rr
- Security
- sampling theory
- 언리얼엔진
- Race condition
- 유스케이스
- 유니티
- 게임 개발
- stride
- DP
- ret2libc
- AINCAA
- frequency-domain spectrum analysis
- Double free
- dirty cow
- STCF
- 메카님
- Today
- Total
다양한 기록
BoF - Countermeasures & 파훼법 본문
버퍼 오버플로우의 대응책
개발자 관점
- 안전한 함수 사용 (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 |