
CVE-2025-5548 취약점에 대한 기술적 연구
본 연구에서는 FreeFloat FTP Server v1.0에 존재하는 **스택 버퍼 오버플로(stack buffer overflow)**와 관련된 CVE-2025-5548 취약점을 분석한다. 이 실습의 주요 목표는 취약한 애플리케이션이 조작된 입력에 어떻게 반응하는지 이해하고, 통제된 환경에서 검증 오류가 결국 프로그램의 실행 흐름에 어떤 영향을 미칠 수 있는지 관찰하는 것이다.
이 저장소의 개발은 최종 결과만 보여주는 데 그치지 않고, 환경 준비, 도구 선택, 오류 관찰, 메모리 분석, 취약점의 실제 영향 검증 등 연구의 전체 과정을 담고 있다.
본 연구는 서로 구분되는 두 개의 블록으로 구성된다.
이 섹션에서는 실습 환경을 어떻게 구성했는지, 어떤 운영 체제를 사용했는지, 취약한 애플리케이션이 무엇인지, 분석을 수행하는 데 필요한 도구가 무엇인지 설명한다.
두 번째 부분은 실습에 중점을 둔다. 여기서는 오류를 탐지하고, 메모리 손상을 확인하고, 레지스터 덮어쓰기를 연구하고, 취약점을 어떻게 악용할 수 있는지 검증하는 과정을 설명한다.
실습은 Windows 11 Pro 25H2 (Build 26200.6584) 가상 머신에서 수행되었다. 선택된 취약한 애플리케이션은 FreeFloat FTP Server v1.0으로, 최신 프로그램에 일반적으로 존재하는 많은 보호 기능이 없어 이러한 유형의 실습에 적합한 오래된 소프트웨어이다.
가상 머신의 네트워크는 NAT 모드로 구성되었으며, 이를 통해 종속성을 설치하고 도구를 다운로드하며 실습 환경의 기본 연결을 유지할 수 있는 인터넷 접근이 가능했다.
분석의 모든 단계를 수행하려면 여러 유틸리티가 필요했다. 일부는 환경을 준비하는 데 사용되었고, 다른 일부는 바이너리를 검토하거나 오류 발생 시 프로세스의 동작을 관찰하는 데 사용되었다.
리포지토리를 다운로드하고, 특정 리소스를 체계적으로 정리하며, 연구 중 사용된 자료의 관리를 용이하게 하기 위해 사용되었다.
연결성을 확인하고, 노출된 서비스를 식별하며, 대상이 예상 포트에서 올바르게 응답하고 있는지 확인하는 지원 도구로 사용되었다.
Windows 시스템 내에서 저수준 분석 및 디버깅 작업에 유용한 라이브러리, 헤더 및 도구를 제공하기 위해 설치되었다.
빠른 편집, 스크립트 검토 및 문자열이나 테스트 데이터의 간단한 조작에 사용되었다.
스크립트 작성, 자동화 테스트, 코드 작업을 보다 체계적으로 수행할 수 있는 편리한 환경으로 사용되었다.
특히 더 긴 스크립트를 검토하거나 페이로드 구성과 관련된 로직을 디버깅해야 할 때 유용했다.
두 가지 버전이 고려되었다:
Ghidra를 실행하는 데 필요했는데, 이 도구는 Java 기반으로 개발되었기 때문이다.
실행 중 프로그램의 상태를 관찰하고, 레지스터를 확인하고, 메모리를 검토하며, 오류가 발생하는 정확한 지점을 분석하는 데 사용되었다.
바이너리를 검토하고 보안 관점에서 의심스러운 함수를 찾기 위해 정적 분석 단계에서 사용되었다.
취약한 프로그램의 내부 로직을 디컴파일하고 더 잘 이해하기 위한 보조 도구로 사용되었다.
이 플러그인은 패턴 생성, 오프셋 계산 및 페이로드의 문제가 되는 문자 식별과 같은 작업을 용이하게 했다.
실습의 주요 구성 요소는 개념 증명(PoC) 내에서 대상 시스템 역할을 하는 FreeFloat FTP Server v1.0이었다. 이 소프트웨어가 흥미로운 이유는 고전적인 스택 버퍼 오버플로 취약점을 포함하고 있어 교육적 분석에 매우 적합한 사례라는 점이다.
이러한 유형의 실습을 위해 이미 준비된 가상 머신이 존재하지만, 이 경우에는 환경을 문서화하고 사용된 도구를 정당화하기로 선택했다. 이를 통해 각 애플리케이션이 실습 환경의 일부인 이유와 분석 중 수행하는 역할을 더 잘 이해할 수 있다.
첫 번째 단계는 FTP 서비스에 접근 가능하고 올바르게 작동하는지 확인하는 것이었다. 연결이 확인되면 정적 분석 도구를 통해 바이너리를 검토하여 문자열 처리와 관련된 잠재적 취약점을 찾았다.
이 검토 중에 strcpy 및 strcat과 같은 안전하지 않은 함수가 나타나 서비스가 과도하게 긴 입력에 취약할 수 있다는 의심을 강화했다. 또한 사용자가 제어하는 데이터를 수신할 수 있는 여러 FTP 프로토콜 명령을 검토하여 그중 하나를 테스트의 주요 후보로 선택했다.
이를 바탕으로 프로세스를 디버거에 로드하여 실행 중 동작을 관찰했다.
다음 단계는 프로그램이 더 이상 올바르게 응답하지 않는지 확인하기 위해 점점 더 긴 문자열을 보내는 것이었다. 이 절차를 통해 특정 크기 이상에서 서비스가 실패하고 결국 메모리 변경을 초래한다는 것을 검증할 수 있었다.
이러한 동작은 단순한 표면적 검증 오류가 아니라 프로세스 흐름에 영향을 미치는 실제 메모리 손상임을 확인시켜 주었다.
오류를 발생시킨 후, 복귀 주소(return address)에 도달하는 데 필요한 바이트 수를 정확히 계산해야 했다. 이를 위해 비반복 시퀀스를 사용하여 크래시 순간 EIP에 반영된 값이 전송된 입력 내의 정확한 위치와 연관될 수 있도록 했다.
이 절차를 통해 제어 레지스터를 덮어쓰는 데 필요한 정확한 오프셋을 얻을 수 있었다.
오프셋을 확인한 후, 복귀 주소를 쉽게 식별할 수 있는 값으로 대체하는 새로운 테스트를 준비했다. 목표는 프로그램이 EIP를 통제된 방식으로 수정할 수 있는지 확인하는 것이었다.
테스트는 성공적이었으며, 디버거는 레지스터에 정확히 입력된 값이 포함되어 있음을 보여주었다. 이는 실행 흐름을 변경하고 선택한 주소로 리디렉션할 수 있음을 증명했다.
이 지점에 도달한 후, 어떤 바이트가 페이로드를 방해할 수 있는지 분석했다. 이러한 유형의 취약점에서는 특정 문자가 잘림, 예기치 않은 변경 또는 문자열의 조기 종료를 유발하는 것이 일반적이다.
메모리에서의 연속적인 비교를 통해 여러 bad characters가 식별되었으며, 그중에는 다음이 포함된다:
\x00\x0a\x0d이를 탐지하는 것은 취약한 프로그램의 동작과 호환되는 안정적인 최종 페이로드를 구성하는 데 중요했다.
다음 단계는 실행을 페이로드가 저장될 메모리 영역으로 리디렉션할 수 있는 적절한 주소를 찾는 것이었다. 이 분석은 운영 체제와 활성 보호 기능을 고려하여 수행해야 했는데, 일부 주소는 실행 간에 안정적이지 않기 때문이다.
실습 환경 내에서 흐름 덮어쓰기를 공격자가 제어하는 입력과 연결할 수 있는 유효한 참조 주소를 찾았다.
흐름 제어가 검증된 후, 이전에 발견된 제약 조건과 호환되는 shellcode를 구성했다. 또한 예상 위치에 약간의 편차가 있더라도 CPU가 페이로드 시작 부분에 안전하게 도달할 수 있도록 중립 명령 영역을 추가했다.
이 단계는 실행의 신뢰성을 높이는 데 중요했다.
마지막 단계에서는 공격자 머신에서 listener를 실행한 상태로 취약한 서비스에 전체 페이로드를 전송했다. 그 결과 대상 시스템과의 원격 연결이 수립되었으며, 이는 취약점이 단순히 프로그램을 중단시키는 것뿐만 아니라 제어된 실행을 얻을 수 있음을 확인시켜 주었다.
이는 오류의 실제 영향을 입증하며 공격적 및 방어적 보안 관점에서 그 중요성을 정당화한다.
CVE-2025-5548에 대한 연구는 현대적인 보호 메커니즘이 없는 오래된 애플리케이션이 메모리 손상에 기반한 고전적인 악용 기술에 취약할 수 있음을 명확히 보여준다.
실습 전반에 걸쳐 환경 준비, 오류의 초기 관찰, 버퍼 오버플로 검증, 실행 레지스터 제어, 페이로드 디버깅, 최종 결과 확인 등 여러 핵심 단계를 수행했다.
기술적 테스트를 넘어, 이 사례는 안전하지 않은 함수의 사용과 보호 조치의 부재가 레거시 소프트웨어에서 여전히 중요한 위험인 이유를 이해하는 데 도움이 된다. 따라서 이러한 유형의 실습은 통제된 환경에서 리버싱, 취약점 분석 및 악용에 대한 지식을 강화하는 데 특히 유용하다.