Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2019-25485 — R 3.4.4의 스택 기반 버퍼 오버플로우. x86에서는 완전한 익스플로잇이 가능하지만, x64에서는 프로그램 제약으로 인해 가젯 분석을 통한 RIP 제어만 가능합니다. 두 아키텍처에서 동일한 취약점이 서로 다른 익스플로잇 경로로 이어집니다. | Kitploit
도구/GitHubGitHub/themalwareguardian/cve-2019-25485
Vulnerability AnalysisExploitationReverse EngineeringShellcodeDebuggersLearning & EducationPayload DevelopmentBinary Exploitation
GitHub
themalwareguardian/cve-2019-25485

CVE-2019-25485

R 3.4.4의 스택 기반 버퍼 오버플로우. x86에서는 완전한 익스플로잇이 가능하지만, x64에서는 프로그램 제약으로 인해 가젯 분석을 통한 RIP 제어만 가능합니다. 두 아키텍처에서 동일한 취약점이 서로 다른 익스플로잇 경로로 이어집니다.

저장소 보기
126개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

🐞 CVE-2019-25485: R 3.4.4 - 스택 기반 버퍼 오버플로(x86 및 x64)

R 3.4.4의 스택 기반 버퍼 오버플로입니다. x86에서는 완전한 익스플로잇이 가능하지만, x64에서는 프로그램 제약으로 인해 가젯 분석과 함께 RIP 제어만 가능합니다. 두 아키텍처에서 동일한 취약점이 존재하지만, 서로 다른 익스플로잇 경로로 이어집니다.




📑 목차

  • 이 저장소가 존재하는 이유
  • 이 취약점이 흥미로운 이유
  • 컨텍스트 및 영향받는 소프트웨어
  • 취약점 정보
  • 크래시 유발
  • 익스플로잇



🎓 이 저장소가 존재하는 이유

이 저장소는 메모리 손상 익스플로잇을 가르칠 때 사용하는 자료의 일부입니다 (정규 업무 외에도 여러 사이버 보안 과정에서 차세대 리버스 엔지니어를 양성하는 데 기여하고 있습니다).

CVE-2019-25485는 학생들이 동일한 취약점을 두 가지 다른 아키텍처에서 분석하고, 그 차이점을 직접 확인할 수 있도록 하기 위해 사용하는 사례입니다. R 3.4.4는 x86 및 x64 버전으로 제공되며, 동일한 오버플로(동일한 GUI 필드, 동일한 입력 핸들러, 동일한 크래시)가 두 버전 모두에 존재합니다. 두 경우 모두 여기에 별도의 실습으로 문서화 및 익스플로잇되어 있습니다:

  • x86 버전은 고전적인 베니라 EIP 덮어쓰기 방법론을 따릅니다. 오버플로가 EIP에 도달하고, ASLR이 없는 모듈에서 JMP ESP 가젯을 찾아 EIP 덮어쓰기 이후에 셸코드를 배치하여 작동하는 리버스 셸을 얻습니다. 스택 기반 버퍼 오버플로의 기본을 보여주는 깔끔하고 직접적인 익스플로잇입니다.
  • x64 버전은 RIP 제어에 도달하고 오프셋을 확인하지만, 완전한 RCE는 달성되지 않습니다. 이는 의도적이며 실습의 핵심입니다. x64 익스플로잇 시도는 가젯 검색 과정을 완전히 문서화하고, 각 가젯 범주가 이 특정 컨텍스트에서 실패하는 이유를 분석하며, 입력 핸들러가 부과하는 널 바이트 제약 조건을 설명하고, DEP를 우회하는 데 필요한 ROP 체인 구조와 이러한 입력 벡터의 제약 조건으로 인해 왜 구축할 수 없는지 설명합니다. 이 단일 취약점으로부터 완전한 익스플로잇을 위한 유일한 이론적 경로는 JOP(Jump-Oriented Programming)이며, 이는 RET 대신 JMP로 끝나는 가젯을 연결하고 제어 흐름을 위해 스택에 의존하지 않습니다. RIP 덮어쓰기 이후에 쓰기 가능한 제어 영역이 전혀 없는 상태에서 수동으로 JOP 체인을 구축하는 것은 이 실습의 범위를 벗어나는 고급 공개 과제입니다. 실패는 방법론의 결함이 아닙니다. 그것이 바로 교훈입니다.



💡 이 취약점이 흥미로운 이유

R 3.4.4는 통계 컴퓨팅 애플리케이션이지, 네트워크 서비스나 브라우저가 아닙니다. 오버플로는 데스크톱 GUI 필드를 통해 트리거되므로, 공격 표면은 제가 가르치는 다른 모든 사례와 완전히 다릅니다. 이 사례가 교육에 유용한 이유:

  • 네트워크 구성 요소가 없습니다. 페이로드는 GUI 필드에 붙여넣기 되며, 이는 특히 GUI 입력 핸들러가 취약한 복사 작업에 도달하기 전에 바이트를 처리하는 방식과 관련된 다른 종류의 제약 조건을 도입합니다.
  • RIP 제어가 확인됩니다. 오버플로가 RIP에 도달하고 오프셋이 발견됩니다. 이는 취약점에 도달할 수 없는 경우가 아닙니다. 명령어 포인터 제어가 완전히 입증되었습니다.
  • 정규 주소 강제 적용이 고전적인 접근 방식을 무너뜨립니다. x86에서는 EIP를 덮어쓰고 셸코드를 추가합니다. x64에서는 RIP의 상위 바이트가 정규 주소가 되려면 \x00\x00이어야 하며, 이러한 널 바이트는 가젯 주소 직후에 입력을 종료시킵니다. 덮어쓰기 이후에는 셸코드 또는 ROP 체인 값을 위한 공간이 없습니다.
  • 널 바이트 변환이 ROP를 차단합니다. GUI 필드는 널 바이트를 버퍼에 복사하기 전에 공백으로 변환합니다. 모든 x64 주소는 상위 절반에 널 바이트를 포함합니다. ROP 체인 값으로 스택에 배치할 수 있는 가젯 주소는 없으며, 모두 손상된 상태로 도착합니다.
  • DEP가 직접 실행을 차단합니다. 셸코드 버퍼에 도달하는 방법이 발견되더라도 DEP가 적용되어 스택에서의 실행을 차단합니다.
  • 가젯 검색이 완전히 문서화됩니다. 로드된 모든 모듈에서 가젯을 덤프하고, 유형별로 필터링하며, 각 가젯이 실패하는 이유를 추론하는 과정이 단계별로 문서화됩니다. 이는 모든 익스플로잇 개발자가 갖추어야 할 핵심 기술입니다.
  • VirtualProtect를 위한 ROP 체인 골격이 설명됩니다. 학생들은 DEP를 우회하기 위해 정확히 무엇이 필요한지, 호출 규약이 왜 중요한지, 그리고 이 특정 체인이 입력 제약 조건 때문에 왜 구축될 수 없는지 확인합니다.



🔍 컨텍스트 및 영향받는 소프트웨어

R은 Windows, macOS, Linux에서 사용 가능한 통계 컴퓨팅 및 그래픽 환경입니다. 취약점은 GUI 환경설정(Preferences) 대화 상자, 특히 'Language for menus and messages' 필드에 있으며, 사용자 입력을 고정 크기 스택 버퍼로 길이 검증 없이 복사합니다.

주요 기술 세부 사항:

  • 취약점 유형: 스택 기반 버퍼 오버플로
  • 영향받는 버전: R 3.4.4 x86_x64
  • 영향받는 엔드포인트: 편집 -> GUI 환경설정 -> 'Language for menus and messages'
  • 취약한 구성 요소: GUI 환경설정 입력 핸들러
  • 필요한 인증: 없음 (로컬 애플리케이션)
  • 영향: x86 - 원격 코드 실행 | x64 - 제어 흐름 확인



⚠️ 취약점 정보

R 3.4.4는 'Language for menus and messages' 필드를 처리할 때 제공된 문자열을 길이 확인 없이 고정 크기 스택 버퍼에 복사합니다. 취약한 로직의 단순화된 버전은 다음과 같습니다:

char language_buffer[256];

strcpy(language_buffer, user_input);

충분히 긴 문자열을 보내면 복사가 버퍼 끝을 넘어 쓰여지면서, 저장된 반환 주소가 덮어쓰일 때까지 스택이 손상됩니다. 함수가 반환될 때 CPU는 스택에서 공격자가 제어하는 값을 RIP로 로드하고 해당 주소로 점프를 시도합니다.

x64에서 Windows는 점프가 발생하기 전에 정규 주소 검증을 강제합니다. 0x4141414141414141과 같은 비정규 값은 RIP가 로드되기 전에 즉시 액세스 위반을 트리거합니다. 이는 크래시가 x86과 다르게 보인다는 것을 의미합니다. RIP = 4141414141414141과 같은 깔끔한 값이 나타나지 않습니다. 오프셋은 RIP에서 직접 읽는 것이 아니라, 크래시 후 스택에서 사이클릭 패턴을 읽어 찾아야 합니다.




💥 크래시 유발

언어 필드에 긴 문자열을 붙여넣으면 크래시가 재현됩니다. 인증이 필요하지 않습니다. Python을 사용한 페이로드 생성 예시:

import struct

payload = b'A' * 400

with open('payload.txt', 'wb') as f:
	f.write(payload)
R 3.4.4 x64 실행
편집 -> GUI 환경설정
payload.txt의 내용을 'Language for menus and messages'에 붙여넣기
확인 클릭



💣 익스플로잇

이 저장소의 목표는 크래시를 시연하는 것뿐만 아니라, 두 아키텍처에서 완전한 익스플로잇 과정을 안내하고, x86에서 작동하는 것과 x64에서 실패하는 것, 그리고 더 중요하게는 그 이유를 문서화하는 것입니다.

주 README를 깔끔하게 유지하기 위해 상세한 익스플로잇 노트, 스크립트 및 디버거 단계는 이 저장소의 Vulnerability 📂 폴더 안에 x86 및 x64 하위 폴더로 나누어 배치했습니다.

거기에서 두 아키텍처에 대한 전체 워크플로를 찾을 수 있습니다:

x86 - 전체 익스플로잇:

  • 언어 필드 퍼징을 통한 크래시 식별.
  • 오프셋 발견을 통한 스택에서 EIP의 정확한 위치 파악.
  • 잘못된 문자 분석을 통한 페이로드를 손상시키는 바이트 식별.
  • ASLR 또는 SafeSEH 없이 컴파일된 모듈인 stats.dll에서 JMP ESP 가젯 찾기.
  • 셸코드 배치 및 실행, 완전한 리버스 셸 획득.

x64 - RIP 제어 및 익스플로잇 분석:

  • DLL 로드 이벤트로 인한 지속적인 중단을 피하기 위해 x64dbg 구성.
  • 3단계에 걸친 언어 필드 퍼징을 통한 정확한 크래시 크기 찾기.
  • RIP가 아닌 스택에서 사이클릭 패턴을 읽어 RIP 오프셋 찾기.
  • 자동 널 바이트 패딩과 함께 6바이트 덮어쓰기를 사용한 RIP 제어 확인.
  • 널 바이트에서 공백으로의 변환을 근본적인 입력 제약 조건으로 식별.
  • rp++를 사용하여 로드된 모든 R 모듈에서 가젯 덤프 및 PowerShell로 필터링.
  • 각 가젯 범주(CALL RBX, CALL RSP, POP RSP, SUB RSP, PUSH RSP)를 분석하고 각각이 이 특정 컨텍스트에서 실패하는 이유 문서화.
  • VirtualProtect를 호출하고 DEP를 우회하는 데 필요한 ROP 체인 구조 설명 및 널 바이트 제약 조건으로 인해 구축할 수 없는 이유 설명.
  • JOP를 유일한 이론적 경로로 문서화하고, 그것이 여전히 공개 과제로 남아 있는 이유 설명.
도구 다운로드