MItigation : 보호 기법
window는 winchecksec으로, linux는 checksec(pwndbg)로 확인한다.
[ winchecksec JSON parsing code ]
JSON 파일이 보기 힘들어서 만든 코드이다 winchecksec와 같은 경로에 두고 원하는 파일 경로를 넣어주면 됨
import os
import sys
import json
import subprocess
def get_security_info(file_path):
"""winchecksec.exe의 JSON 출력에서 보안 정보를 반환합니다."""
result = subprocess.run(['winchecksec.exe', '--json', file_path], capture_output=True, text=True)
try:
security_info = json.loads(result.stdout)
return security_info[0]['mitigations']
except (json.JSONDecodeError, IndexError, KeyError) as e:
print(f"Error parsing security info for {file_path}: {e}")
return None
def scan_directory(path):
"""주어진 경로에서 DLL 및 EXE 파일을 스캔하고 보안 정보를 확인합니다."""
dll_files_without_aslr = []
dll_count = 0
for root, _, files in os.walk(path):
for file in files:
if file.endswith(('.dll', '.exe')):
file_path = os.path.join(root, file)
dll_count += 1
security_info = get_security_info(file_path)
if security_info:
aslr_status = security_info['aslr']['presence']
if aslr_status == 'NotPresent':
safeSEH_status = security_info['safeSEH']['presence']
gs_status = security_info['gs']['presence']
seh_status = security_info['seh']['presence']
dll_files_without_aslr.append(
[file_path, aslr_status, safeSEH_status, gs_status, seh_status]
)
else:
print(f"{file_path} : ASLR Enabled")
return dll_count, dll_files_without_aslr
def main():
"""스크립트의 메인 함수입니다."""
if len(sys.argv) < 2:
print("Usage: python check_security.py <directory_path>")
sys.exit(1)
path = sys.argv[1]
if not os.path.isdir(path):
print(f"The path {path} is not a directory.")
sys.exit(1)
dll_count, dll_files_without_aslr = scan_directory(path)
# 검사 결과 출력
print(f"Checked DLL/EXE files: {dll_count}")
print("=" * 60 + " ASLR Not Present & SafeSEH Check " + "=" * 60)
for entry in dll_files_without_aslr:
print(f"{entry[0]:<70} | ASLR: {entry[1]:<10} | SEH: {entry[4]:<10} | SafeSEH: {entry[2]:<10} | GS: {entry[3]:<10}")
if __name__ == "__main__":
main()
Window | Linux |
DEP | NX bit |
ASLR | ASLR |
Stack Canary | Stack Cookie (GS) |
CFI | CFG |
이름이 같지만 실제 내부 동작 과정은 다르거나, 이름이 다르지만 동작은 같은 것들이 존재한다.
(같은 행에 있는 보호기법들은 같은 "역할"을 하는 보호기법이다)
ASLR
Address Space Layout Randomization
메모리 레이아웃을 무작위하게 배치하는 공격 기법이다.
OS 수준에서 구현되어 있다.
Linux
무작위화 수준
- 메모리 영역 대부분 무작위화 (코드, 힙, 스택 등)
- /proc/sys/kernel/randomize_va_space 에서 확인할 수 있음
- kernel도 로드될 때마다 무작위화 되어 로드됨 (KASLR)
무작위화 될 때, page 단위로 되기 때문에 64비트 프로그램의 경우 아래 4자리는 보통 고정되어있게 된다.
또한, 레이아웃이 무작위화 되는 것이기 때문에 시작 부분에서 공격 대상의 차이를 알아내면 공격 가능하다 .
적용 시점
- nmap()으로 메모리 맵을 요청할 때 실행됨
Window
무작위화 수준
- PE파일과 dll을 무작위화 (exe)
- 실행 시 pe파일과 dll이 무작위 위치에 배치됨
적용 시점
- PE 파일 로드 시 적용됨
DEP (Data Execution Prevention) | NX bit
- 스택, 힙 등의 메모리 영역에 실행 권한을 부여하지 않는 공격기법이다.
- 하드웨어 수준에서 구현되어 있다.
리눅스와 윈도우 모두 하드웨어에서 구현되어 실행 권한을 부여하지 않기 때문에, 부르는 이름이 다른 것이지 실질적으로 역할과 구현 방식에 차이는 존재하지 않는다.
스택, 힙 등의 메모리 영역에 실행 권한을 부여하지 않으면 스택에 shellcode를 올리는 등 기본적인 공격을 방지할 수 있다.
DEP나 NX bit가 활성화 되어있으면, 이미 실행 권한이 부여되어있는 라이브러리 코드를 이용하는 ret2libc 등의 공격 기법을 활용 가능
Stack Canary | Stack Cookie
- 스택 오버플로우가 발생하여 스택이 변조되었는지 확인할 수 있는 공격 기법
- ret address와 스택 사이에 canary (cookie) 값을 끼워넣어, 해당 부분이 원래와 다르면 프로그램 실행을 종료한다.
- OS 수준에서 구현된다.
Linux
https://m-in-zu.tistory.com/72
카나리를 삽입하는 과정이 존재한다.
- -fstack-protector 옵션으로 canary를 추가할 수 있음
- fs 레지스터의 0x28 부분 (무작위값)으로 설정된다
따라서 canary가 설정되어 있으면 인포릭 -> 익스플로잇 순서로 카나리 값을 알아낸 후에 똑같이 카나리 값으로 덮어서 익스할 수 있다.
Window
- Stack Cookie 라고 한다
- GS 플래그로 스택 보호 기능을 활성화할 수 있다.
- 쿠키 값이 변조 되면 __security_check_cookie가 불린다.
- 각 프로세스에 대해 고유한 쿠키값을 생성한다.
- window 또한 fs의 값을 이용하여 카나리 값을 관리한다.
CFI | CFG
Control Flow Integrity
- 메모리 손상으로 인해 발생하는 제어 흐름 변조를 막기 위한 mitigation
- linux 와 window에서 구현 방법도 이름도 다르다
Linux
- -fsanitize=cfi 옵션으로 설정 가능
- 런타임 검사 삽입 : 컴파일러가 제어 흐름을 추적하여 함수 포인터가 예상된 대상이 아닌 다른 대상으로 점프하는 경우를 확인함
- 예상되지 않은 주소로의 점프 차단
Window
- 코드 재사용 공격 차단
- CFG를 직접 활성화 해야함
- 간접 분기 지점에서 허용된 대상의 메모리 주소만 접근할 수 있도록 함 -> 제어 흐름 변조 방지
- 비정상적인 코드 흐름을 방지함
'Hacking > Window' 카테고리의 다른 글
[IDA Pro] 사용법 정리 (3) | 2024.07.21 |
---|---|
MuseScore DoS Vulnerability Write Up (2) | 2024.07.18 |
[ Domato ] 사용법 (4) | 2024.05.18 |
PE(Portable Executable) file format (0) | 2024.05.06 |
[Fuzzing] WinAFL을 이용한 개념정리 (2) | 2024.05.05 |