
이 프레임워크를 통해 사용자는 JOP 가젯을 발견할 수 있으며, DEP를 우회하기 위한 완전한 JOP 체인 구축을 자동화할 수 있습니다. JOP ROCKET은 Windows 점프 지향 프로그래밍(Jump-Oriented Programming)을 위한 궁극적인 솔루션입니다. JOP ROCKET은 또한 새로운 2-가젯 디스패처를 찾아내어 JOP로 가능한 범위를 크게 확장합니다.

참고: 2.15 버전부터 2-가젯 디스패처(two-gadget dispatcher)를 도입했습니다. 이를 통해 디스패처 가젯의 가능성이 크게 확장됩니다. 2021년 5월 26일 2.15 버전에는 많은 최적화와 추가적인 새로운 기능이 포함되었습니다.
업데이트: 2021년 11월 29일: @Hack in Riyadh 발표용 슬라이드와 셸코드 없는 JOP(Shellcodeless JOP)에 관한 백서(white paper)를 업로드했습니다. 발표에서 사용된 무성 데모 동영상은 다음 링크에서 확인할 수 있습니다: https://www.youtube.com/playlist?list=PLynyJsHgQaJ3AfQGKVkeZJ9cWa7mIqDMV
업데이트: 2022년 12월 1일: 이 GitHub 문서 끝부분에 Q & A를 추가했습니다. 여기에는 리소스(발표 및 논문) 링크가 포함되어 있습니다.
현재 버전: 2.15
JOP ROCKET(Jump-oriented Programming Reversing Open Cyber Knowledge Expert Tool)은 x86 Windows 환경에서 JOP 가젯 탐색을 돕기 위해 설계된 도구입니다. 이 도구는 DEF CON 27에서 공개되었으며, Dr. Bramwell Brizendine과 Dr. Josh Stroschein의 발표 주제였습니다. 대규모 업데이트가 개발 중이었으며 2020년 9월에 출시되었고, 가까운 시일 내에 소규모 업데이트가 계획되어 있습니다.
이 도구를 다운로드하려면 https://github.com/Bw3ll/JOP_ROCKET로 이동하세요.
많은 주요 업데이트가 이루어졌습니다. 많은 업데이트를 활용하려면 2.15 이전의 모든 버전을 업데이트하는 것이 좋습니다. 여기에는 자동 JOP 체인 생성, 새로운 유형의 가젯 발견, 새로운 유형의 디스패처 가젯, 그리고 2-가젯 디스패처가 포함됩니다. JOP ROCKET은 또한 성능과 속도를 향상하고 최적화하기 위한 많은 중요한 변경을 거쳤습니다.
JOP ROCKET은 Capstone 디스어셈블리 엔진과 기타 종속성을 활용하는 Python 프로그램입니다. 이 소프트웨어 익스플로잇 도구는 점프 지향 프로그래밍(Jump-oriented Programming)을 용이하게 하기 위해 설계된 완전한 기능을 갖춘 산출물입니다. Windows에서 실행되도록 제작되었습니다.
현재 도움말 메뉴에 있는 내용 외에는 사용 정보가 제공되지 않습니다. JOP 익스플로잇을 구성하는 것은 간단하지 않으며 매우 미묘한 이해가 필요합니다. ROP와 일부 유사점이 있지만 많은 차이점이 있습니다. 간단한 데모를 보려면 DEF CON 발표를 참조하세요. https://www.youtube.com/watch?v=PMihX693mPE
이 도구는 Dakota State University의 박사 과정에서 프로그램 내 가장 도전적인 과목인 CSC 848: Advanced Software Exploitation의 일부로 가르쳐졌습니다. 학생들은 DEP 및 ASLR 우회를 포함한 익스플로잇을 완성했습니다.
JOP ROCKET과 관련된 다양한 문제에 대해 도움을 주신(설치 지침 포함) Austin Babcock에게 감사드립니다. 그는 JOP의 대가입니다.
관심 있는 분들이 JOP ROCKET을 사용하여 일부 샘플 토이 바이너리에서 JOP를 테스트하고 연습할 수 있도록 여기에 아카이브, JOP ROCKET challenge - toy binaries.zip을 업로드했습니다. DEP(데이터 실행 방지, Data Execution Prevention)를 우회할 수 있습니까? 취약하다는 것이 보장되고 올바른 가젯이 있는 바이너리에서 JOP를 연습하려는 경우 유용합니다. 동일한 바이너리의 쉬운 버전과 더 어려운 버전이 있습니다. 다만 처음에는 요령을 익힐 때까지 JOP가 더 어려울 수 있습니다. 이러한 바이너리로 JOP를 마스터하면 충분한 가젯이 있다는 가정 하에 실제 세계의 가젯에서도 시도해 볼 수 있습니다. 디스패처 가젯 패러다임을 사용하는 경우 디스패처 가젯이 필요하다는 점을 명심하세요. JOP는 ROP와 혼합하는 것도 가능합니다. JOP 가젯을 사용하여 RET를 가리키게 하면, 예를 들어 JMP EDX에서 EDX가 RET를 가리킬 수 있습니다. 이는 ROP를 작동시키는 데 JOP 가젯이 한두 개만 필요한 경우 더 유용합니다. 하지만 아카이브의 바이너리를 사용하면 디스패처 가젯 패러다임을 몇 가지 다른 방식으로 사용할 수 있습니다!
JOP의 디스패처 가젯 패러다임을 사용하면 ROP를 100% 제거할 수 있습니다. 다만 디스패치 테이블과 디스패처 가젯을 로드하기 위해 두 개의 ROP 가젯으로 시작하는 것이 가장 쉽습니다. 사전 구축된 JOP 체인은 해당 가젯이 존재한다는 가정 하에 이를 자동으로 수행합니다. 그 시점부터는 간접 점프와 간접 호출(JMP EBX, CALL EDX 등)을 모두 사용하는 순수 JOP가 가능합니다.
Python 2.7을 설치합니다. 가장 쉬운 방법은 웹사이트에서 설치하는 것입니다: https://www.python.org/download/releases/2.7/
이미 Python 3가 있는 경우에도 Python 2.7이 필요합니다. 이 도구는 Python 3에서는 제대로 작동하지 않기 때문입니다.
둘 다 있는 경우 특별한 주석을 추가해야 합니다:
#!python2
을 rocket.py 상단에 추가하세요. 그런 다음 "python rocket.py" 대신 "py rocket.py"로 실행하세요. 이렇게 하면 프로그램이 Python 2.7을 사용하여 실행됩니다. 또는 py -2 rocket.py를 실행해도 됩니다.

pip가 Python에 이미 포함되어 있지 않다면 pip를 설치합니다.
링크의 지침에 따라 제공된 스크립트를 저장하고 실행해야 합니다. 오류가 발생하면 "대체(alternate)" 스크립트를 사용해 보세요.
pip가 여전히 작동하지 않으면 "C:\python27\Scripts"(또는 해당 디렉터리)를 Path 시스템 변수에 추가해 보세요:

pip로 종속성 설치를 시작합니다!
참고: pip를 사용한 설치는 Windows 터미널에서 작동해야 하지만 Cygwin 환경에서는 작동하지 않을 수 있습니다. Cygwin을 사용하는 경우 대신 소스 코드로 설치해야 할 수도 있습니다. 이는 더 많은 시간이 소요될 수 있는 작업이므로 각 종속성 제작자의 최신 문서를 참조하시기 바랍니다.
pip install capstone
pip install pefile2
Python 2.7과 함께 pefile이 이미 설치되어 있을 가능성이 높지만, 이 버전은 오래된 버전입니다.
필요한 것은 Pefile2입니다.
프로그램이 pefile2를 사용하도록 하려면 pip uninstall pefile을 실행해야 할 수 있습니다.
기타... 종속성 목록은 이 문서 하단에서 확인할 수 있습니다. 아직 설치되지 않은 경우 각각 설치해야 합니다.
위의 두 가지가 아마 직접 설치해야 할 전부일 것입니다.
대부분의 종속성은 Python에 이미 포함되어 있습니다. 사용 가능한 모듈을 나열하려면 프롬프트를 여세요:

목록을 살펴보고 모든 종속성이 있는지 확인하세요. 없는 항목은 pip 또는 소스 코드를 통해 설치하세요.
참고: pywin32는 Win32file 및 Win32api에 사용됩니다.
하나의 디렉터리에 다섯 개의 파일, 즉 rocket.py, lists,py, checkIt.py, ui.py, stackpivot.py가 모두 있어야 합니다. 도구 사용을 시작하려면 명령줄에서 python rocket.py filename.exe를 실행하세요. 여기서 filename.exe는 JOP 가젯 또는 JOP 체인을 얻고자 하는 프로그램입니다.
"SyntaxError: Missing parentheses in call to 'print'"와 같은 오류가 발생하면 Python 3로 실행되고 있을 가능성이 높습니다. 1단계에서 설명한 수정 방법을 적용하여 프로그램이 Python 2를 사용하도록 해보세요.
"lists" 또는 "ui"와 관련된 오류는 lists.py 및 ui.py 파일의 위치 때문에 발생할 가능성이 높습니다. 이 파일들이 rocket.py와 같은 디렉터리에 있는지 확인하세요.
Cygwin 환경에서 이 도구를 사용하려면 Capstone을 소스에서 설치해야 할 가능성이 높습니다. 이를 수행하는 방법은 다양하며 Capstone 문서에서 도움을 받을 수 있습니다. Cygwin은 원래 도구 개발 중에 사용되었지만 더 이상 그렇지 않습니다. JOP ROCKET v2.0은 Cygwin에서 테스트되지 않았으며, JOP ROCKET은 명령 프롬프트 사용을 권장합니다. 참고: Cygwin 사용은 더 이상 명시적으로 지원되지 않으며, 이 프로그램과 함께 사용하는 것도 더 이상 권장되지 않습니다.
더 자세한 사용 정보는 추후 제공될 예정입니다. 도움이 필요하면 DEF CON 27 발표와 도움말 하위 메뉴를 참조하세요.
시작하려면 다섯 개의 Python 파일(rocket.py, ui.py, stackpivot.py, checkIt.py, lists.py)을 같은 디렉터리에 두어야 합니다. 그런 다음 명령줄에서 실행하세요. 설치 디렉터리의 로컬 파일을 제공할 수 있지만 모듈/DLL은 찾을 수 없습니다. 이를 찾으려면 프로그램이 설치되어 있어야 하며, 애플리케이션의 절대 경로를 텍스트 파일 안에 입력하여 명령줄 인수로 제공할 수 있습니다. 예:
python rocket.py input.txt
input.txt 안에는 절대 경로(예: C:\rocket2\sample_binary.exe)가 있어야 합니다. 절대 경로를 제공하면 원하는 경우 스캔할 모듈도 추출할 수 있습니다. 로컬 디렉터리의 프로그램만으로 JOP ROCKET을 사용하려면 이미지 실행 파일 자체에 대해서만 가젯을 찾습니다(즉, DLL은 없음). 이러한 방식으로 사용하려면 다음 구문을 사용하세요:
python rocket.py sample_binary.exe
실행 파일이 같은 디렉터리에 있으면 위에서 설명한 방식으로 JOP ROCKET을 사용할 수 있습니다.
분석할 실행 파일 또는 DLL을 로드할 때 두 가지 방법이 있습니다. 첫 번째는 실행 파일을 같은 디렉터리에 두고 이를 인수로 사용하여 프로그램을 실행하는 것입니다(예: python rocket.py binary.exe). 이렇게 하면 많은 시스템 모듈을 식별하고 추출할 수 있습니다. 그러나 일부 비시스템 바이너리는 찾을 수 없습니다. 포괄적인 범위를 위해 사용자는 텍스트 파일에 애플리케이션의 절대 경로를 제공하고 이를 ROCKET의 입력으로 사용해야 합니다(예: python rocket.py input.txt). 그러면 ROCKET이 대상 애플리케이션과 관련된 비시스템 DLL을 찾고, 추출하고, 검색할 수 있습니다. 따라서 일반적으로 텍스트 파일을 통해 바이너리를 입력으로 제공하는 것이 좋습니다. 그렇지 않으면 일부 DLL이 제외될 수 있기 때문입니다. 예: python rocket.py binaryToScan.txt. binaryToScan.txt에는 바이너리 경로, C:\Users\CoolPerson\Desktop\Instructions\targetBinary.exe가 포함되어야 합니다.
32비트 Python은 매우 큰 바이너리에서 제대로 작동하지 않습니다. 이러한 바이너리를 처리하려면 64비트 Python을 사용해야 합니다.
다음은 Austin이 32비트 Python에서 64비트 Python으로 전환하는 방법에 대해 제공한 지침입니다: python2.7의 64비트 버전을 설치하려면 먼저 기존 설치 버전이 제거되었는지 확인하세요. 64비트 버전을 설치한 후 "DLL load failed: %1 is not a valid Win32 application"과 같은 라이브러리 가져오기 오류가 발생할 수 있습니다. 이는 Python이 이전에 설치된 32비트 버전을 로드하려고 하기 때문에 발생합니다. 이 문제를 해결하려면 pip를 사용하여 라이브러리를 제거하세요. Python 2와 3이 모두 설치된 경우 "py -2 -m pip "로 사용하여 올바른 버전의 pip가 사용되도록 하세요.
capstone 문제 해결은 간단합니다:
py -2 -m pip uninstall capstone
py -2 -m pip install capstone
win32api 가져오기 오류는 pywin32와 관련이 있습니다. pip가 이 과정을 자동화하지 못할 수 있으므로 제거가 더 어렵습니다. ...\Python27\Lib\site-packages 내의 PyWin32 파일을 삭제하여 수동으로 제거해야 할 수도 있습니다.
그런 다음 실행합니다:
py -2 -m pip install pywin32
이후 ...\Python27\Scripts\pywin32_postinstall.py -install을 실행하여 설치를 완료합니다.
Q: JOP ROCKET의 특별한 점은 무엇인가요?
A: JOP ROCKET은 디스패처 가젯을 포함한 모든 필수 가젯을 찾아냅니다. 디스패처 가젯을 검색하는 다른 도구는 알지 못합니다. 또한 JOP에 새로운 유형의 가젯과 혁신을 도입합니다. JOP ROCKET은 일련의 다중 스택 피벗을 포함하는 디스패처 가젯 패러다임의 새로운 변형을 사용하여 DEP를 우회하는 완전한 JOP 체인을 생성할 수도 있습니다. 현실적으로 JOP ROCKET 없이 디스패처 가젯 접근 방식을 사용하여 JOP 익스플로잇을 수행하는 것은 매우 어려울 것입니다. 더 제한적인 JOP 가젯을 제공하는 다른 ROP 도구도 있지만, 대부분 향후 작업을 위한 자리 표시자에 불과하며 JOP ROCKET으로 찾은 일부 가젯 없이는 JOP 익스플로잇을 완성할 수 없습니다.
Q: 이전에 어떤 발표에서 JOP ROCKET을 본 것 같은데요? 어디였나요?