SEH Overwrite Stack BOF
SEH Overwrite란 무엇인가?
SEH Overwrite(Stack Overflow) 공격은 악의적인 해커가 프로그램의 예외 처리 시스템을 악용하여 코드를 실행하는 기법입니다. 이 기술은 특정 조건에서 시스템의 의도된 흐름을 방해하면서, 예외 처리 핸들러를 조작하여 공격자가 원하는 코드를 실행할 수 있게 합니다. 스택 쿠키가 적용된 프로그램을 대상으로 한 스택 버퍼 오버플로우 공격에서 SEH 체인에 접근하여 이를 덮어씌우는 과정이 핵심입니다. 이 글에서는 SEH Overwrite의 기본 개념, 공격 과정, 예시 코드 및 방어 방법에 대해 논의하겠습니다.
개념 | 설명 |
---|---|
SEH Overwrite | 예외 처리 체인을 조작하여 악의적인 코드 실행을 유도하는 공격 방식 |
스택 쿠키 | 스택 기반의 버퍼 오버플로우를 방지하기 위해 사용되는 보호 메커니즘 |
예외 처리 핸들러 | 프로그램에서 오류 발생 시 실행되는 함수 |
공격 코드 | 특정한 조건을 만족시키기 위해 구성된 코드 |
기본적으로 SEH Overwrite는 프로그램 흐름을 변조하기 위해 먼저 버퍼 오버플로우를 유발하고, 스택 위에서 구조화된 예외 처리 체인에 강제로 가짜 핸들러 정보로 덮어씌우는 과정을 포함합니다. 이 과정은 스택에서 RET 명령어가 실행된 후 예외가 발생하고, 예외 핸들러가 호출되는 흐름을 어지럽히는 것입니다.
스택 쿠키가 적용된 프로그램은 함수의 말미에 스택 쿠키 검증 코드를 포함하게 되며, 이로 인해 일반적인 스택 오버플로우 공격이 실패하게 됩니다. 공격자는 이러한 제약을 우회하기 위해 예외를 강제로 발생시킴으로써 스택 쿠키 검증 코드를 실행하지 않고 SEH 체인을 조작할 수 있습니다.
💡 근로자 조정해고에 대한 법률적 기준과 예외를 알아보세요! 💡
SEH Overwrite 공격 과정
이제 SEH Overwrite 공격의 구체적인 과정을 살펴보겠습니다. 우리가 사용할 예시로는 reader.exe
라는 프로그램을 사용합니다. 이 프로그램은 고의로 설정한 버그를 포함하고 있으며, 이를 통해 공격자가 이 프로그램을 어떻게 공격할 수 있는지 알 수 있습니다.
예비 단계: 테스트 환경 설정
먼저 공격에 필요한 테스트 환경을 설정합니다. 다음 파이썬 스크립트를 사용하여 1000개의 A로 이루어진 문자열을 2.txt
파일에 작성합니다.
python
import struct
junk1 = A * 1000
f = open(2.txt, w)
f.write(junk1)
f.close()
print([+] text file created successfully)
이 스크립트를 실행한 후, reader.exe
를 인자로 설정하여 실행합니다. 이 과정에서 프로그램의 예외가 발생하게 되며, IDE 또는 디버거에서 특정 주소 (여기서는 0x401079
)로 점프하게 됩니다. 이는 프로그램의 입력을 처리하는 함수(fgets()
)에 의해 발생하며, 이 함수 아래에는 스택 쿠키 검증 코드가 위치하고 있습니다.
버퍼 크기 결정
reader.exe
의 소스 코드에서 오버플로우가 발생하는 변수는 readbuf[500]
입니다. 스택 쿠키 우회를 위해 공격자는 강제로 스택 쿠키 검증 코드가 호출되지 않도록 하여 기존의 SEH를 덮어씌울 필요가 있습니다.
일반적인 스택 버퍼 오버플로우와 달리 SEH Overwrite 공격은 특정한 버퍼 크기를 초과해야 합니다. 예를 들어, 스택 기반의 주소를 파악하고 그에 따라 오버플로우가 발생해야 하는 정확한 크기를 알아야 합니다. 이를 위해 WinDbg와 같은 디버거를 사용하여 스택 베이스 주소를 확인합니다.
버퍼 크기 | 설명 |
---|---|
692 바이트 | 스택 쿠키 검증 코드를 우회하기 위해 필요한 최소 입력 크기 |
500 바이트 | readbuf 의 크기 |
SEH 체인 확인 및 덮어쓰기
0x401079 주소를 실행하면 EXCEPTION_ACCESS_VIOLATION 예외가 발생하여 디버거 제어권이 넘어갑니다. 이 때 등록된 SEH 체인은 정상적으로 가져올 수 있습니다. 하지만, 특정 값을 덮어씌운 후 Next SEH
와 Handler
가 0x41414141
로 변경되어 정상적인 예외 처리가 실패하게 됩니다.
plaintext!mona exchain
위 명령어를 통해 SEH 체인을 확인할 수 있습니다. 하지만, 성공적인 공격을 위해서는 Next SEH
주소에 위치할 POP POP RET 명령어를 통해 예외 처리를 무시하고, 쉘코드로의 정상적인 흐름을 유도해야 합니다.
공격 코드 생성
공격 코드는 다음과 같은 구조로 작성할 수 있습니다. 일반적으로 사용하는 구조는 [Junk * 556][Next SEH][Handler][shellcode][Junk]
입니다. 각 부분에서 Junk는 패딩으로 사용되는 데이터를 의미하고, 각각의 SEH와 Handler 주소는 오버플로우를 통해 덮어씌우게 됩니다.
python
import struct
junk1 = A * 556
nseh = B * 4 # Next SEH
handler = struct.pack(<L, 0x401246) # Handler
buf = D * 400 # shellcode
payload = junk1 + nseh + handler + buf
with open(5.txt, w) as f:
f.write(payload)
print([+] text file created successfully)
위 코드를 통해 5.txt
파일이 생성되며, 이를 reader.exe
로 로드할 때 브레이크 포인트를 설정하고 디버깅을 통해 예외 핸들러의 변화를 추적할 수 있습니다.
결론
💡 근로자 조정해고에 대한 법률적 기준과 예외를 알아보세요. 💡
SEH Overwrite 공격은 프로그래밍에서 매우 위험한 기법 중 하나로, 이 기법을 이해하는 것은 보안 전문가에게 매우 중요합니다. 이 글에서는 SEH Overwrite이 무엇인지, 공격 과정이 어떻게 진행되는지, 그리고 이를 위해 필요한 코드 구성을 상세히 설명하였습니다. 이러한 공격을 방어하기 위하여, 개발자들은 항상 코드 검토 및 보안 업데이트를 진행해야 합니다.
자주 묻는 질문과 답변
질문1: SEH Overwrite 공격을 방어하는 방법은 무엇인가요?
답변1: 스택 보호 기법, 코드 서명 및 안전한 예외 처리 방법을 통해 SEH Overwrite 공격을 방지할 수 있습니다.
질문2: 스택 쿠키란 무엇인가요?
답변2: 스택 쿠키는 버퍼 오버플로우와 같은 공격으로부터 프로그램을 보호하기 위해 사용되는 변조 방지 기능입니다.
질문3: SEH Overwrite 공격이 발생하는 원인은 무엇인가요?
답변3: 프로그램 내에서 메모리 주소에 대한 잘못된 관리와 예외 처리 핸들러의 오류가 결합되어 발생합니다.
질문4: SEH Overwrite의 주요 리스크는 무엇인가요?
답변4: 공격자는 의도하지 않은 코드를 실행할 수 있으며, 이로 인해 시스템 권한 승격 및 데이터 손실이 발생할 수 있습니다.
질문5: 이 공격을 탐지할 수 있는 방법은 무엇인가요?
답변5: 메모리 검사 및 런타임 분석 도구를 통해 비정상적인 메모리 접근이나 오류를 탐지할 수 있습니다.
SEH Overwrite Stack BOF: 공격 기법 및 방어 방법 5가지!
SEH Overwrite Stack BOF: 공격 기법 및 방어 방법 5가지!
SEH Overwrite Stack BOF: 공격 기법 및 방어 방법 5가지!