virtualprotect 예제

DEP가 보호하는 것을 정확하게 보여 드리기 위해 몇 가지 코드 예제를 살펴보겠습니다. 이것은 Java가 DEP를 사용할 수 없다고 생각하는 사람들에게 는 놀라운 일이 될 수 있습니다. 다음은 샘플 코드입니다: 당신이 볼 수 있듯이, 우리는 기본적으로 체인의 시작 부분에 있는 명령(rop 가젯)의 수를 제한합니다. 스택 포인터를 저장한 다음 Virtualprotect 함수/매개 변수를 뛰어넘으면 나중에 매개 변수 자리 표시자를 더 쉽게 덮어쓸 수 있습니다. (걱정하지 마세요 – 당신은 내가 몇 분 안에 무슨 뜻인지 이해할 수 있습니다) 실제 세계에서이 같은 코드를하지 마십시오. 최소한의 코드를 사용하여 예제를 보여주고 있습니다. 첫 번째 인수는 실행할 명령에 대한 포인터이고 두 번째 매개 변수는 창 동작을 나타냅니다. 몇 가지 예 : 또는 스택의 어딘가에, 레지스터 등에서 OS 모듈에 대한 포인터를 찾아야합니다. . 이 경우 비aslr 모듈의 rop 가젯을 사용하여 해당 값을 훔치고 해당 값에 대한 오프셋을 사용하여 OS 함수의 주소로 이동합니다. 그의 원래 논문에서 Hovav Shacham은 높은 수준의 매크로 / 코드 조각을 참조 할 때 “가젯”이라는 용어를 사용했습니다.

요즘 “가젯”이라는 용어는 종종 명령 의 시퀀스를 참조하는 데 사용되며 ret로 끝납니다 (실제로 “가젯”의 원래 정의의 하위 집합일 뿐입니다). 이 미묘함을 이해하는 것이 중요하지만, 동시에 RET로 끝나는 지침 세트를 참조하기 위해이 튜토리얼에서 “가젯”을 사용할 때 용서 할 것이라고 확신합니다. 특정 명령을 찾고 있지만 ret로 끝나는 가젯을 찾을 수 없는 경우 어떻게 해야 합니까? 당신이 당신의 마음에 드는로드 모듈에서 명령에 대한 검색을 수행하고, 당신이 찾을 수있는 유일한 것을 발견 한 경우, RET 전에 “통화 레지스터”명령이 있는 경우 ? 즉, 0x0040127E에서 시작하는 두 번째 rop 가젯이 있음을 의미합니다. 우리는 레지스터에 필요한 값을 넣고 푸시 를 발행 할 수 있습니다 (한 번에 스택에 모든 것을 넣을 것입니다). 두 번째 방법은 이미 스택에 일부 매개 변수(null 바이트가 없는 정적 매개 변수/정적 매개 변수)를 배치하고 일부 ROP 가젯을 사용하여 다른 매개 변수를 계산하고 스택에 쓰는 것입니다(일종의 저격 기법을 사용). 이러한 각 명령은 실행하려는 다음 명령(또는 지침 집합)으로 “이동”해야 합니다. 이 작업을 수행하는 가장 쉬운 방법은 명령뒤에 RET 명령이 수행되도록 하는 것입니다. RET 명령은 스택에서 다음 주소를 선택하고 해당 주소로 이동합니다.

(결국, 우리는 스택에서 체인을 시작하므로 RET는 호출자 (우리의 경우 스택)로 돌아가서 다음 주소를 취합니다.) 그래서 기본적으로, 우리의 체인에서, 우리는 스택에서 주소를 따기 하고 그들에게 이동됩니다. 이러한 주소의 지침은 스택에서 데이터를 선택할 수 있으므로 이러한 바이트는 물론 올바른 위치에 배치되어야 합니다. 이 두 가지의 조합은 우리의 rop 체인을 형성할 것입니다. 팁 : 자신에게 UnxUtils의 사본을 얻을 (가장 중요한 GNU 유틸리티의 포트, Win32에 대한). 그런 식으로 좋은 가젯을 찾기 위해 고양이와 grep을 사용할 수 있습니다 :이 접근 방식에 문제가 있습니다. R+E 영역에 쓰기 때문에 셸 코드자체를 수정할 수 없습니다. WriteProcessMemory 호출은 일시적으로 위치를 쓰기 가능한 것으로 표시하지만 수준을 다시 제거합니다. 즉, 인코딩된 셸 코드(또는 자체적으로 수정하는 셸 코드)를 사용하는 경우 작동하지 않습니다.