rop 예제

Off
Non classé

이것은 x86 프로세서의 일반적인 스택 레이아웃입니다. 여기서 주목해야 할 한 가지는 스택이 위에서 아래로 증가한다는 것입니다. 스택에는 로컬 함수 변수와 함수가 종료될 때 컨트롤 흐름이 반환되는 반환 주소라는 특수 값이 포함됩니다. 스택의 특정 값이 어떤 방법으로든 덮어쓰면 컨트롤 흐름을 프로그램에 데이터를 입력하여 삽입한 셸 코드로 전환할 수 있습니다. 예를 들어 다음 C 코드: 특정 공격에 중점을 두는 것을 고려합니다. 우리가 부딪친 방어는 다른 종류의 공격에 훨씬 덜 효과적일 수 있습니다. 예를 들어, ASLR은 힙 스프레이를 방어하는 데 어려움을 가지고 있습니다. 예를 들어, 일부 임의의 인수로 system()을 호출하려면 바이너리(호출 또는 전역 오프셋 테이블)에서 system() 및 스택에 값을 푸시하거나 이동할 수 있는 일부 가젯만 있으면 됩니다. RDI 레지스터에 대한 값입니다(x64 바이너리의 경우).

끔찍한 C 자습서는 다음과 같은 victim.c와 같은 예제를 포함할 수 있습니다. 이러한 공격에 대한 기능적 방어를 만드는 방법을 살펴보겠습니다. ROP를 사용하면 단일 함수를 호출하는 것보다 훨씬 더 강력한 작업을 수행할 수 있습니다. 실제로 사용할 수 있는 함수를 호출하는 대신 임의의 code6을 실행하는 데 사용할 수 있습니다. 우리는 ret로 끝나는 명령의 짧은 시퀀스인 가젯으로 돌아가서이 작업을 수행합니다. 예를 들어, 다음 가젯 쌍을 사용하여 임의의 위치에 임의의 값을 작성할 수 있습니다. ret 가젯을 사용하여 인수 위의 스택을 첫 번째 함수로 이동합니다. 우리는 단지 팝을 사용하고 있기 때문에; ret 가젯은 스택을 조정하기 위해, 우리는 (값이 어쨌든 무시됩니다) 팝업 무엇을 등록 상관하지 않습니다. 예를 들어, 다음 binary3을 악용합니다: 이 자습서에서는 지금까지 눈에 띄는 스택 오버플로 익스플로익에 초점을 맞추고 ROP 체인의 기본 을 설명하고 ROP 공격으로부터 방어하기 위해 실행 가능한 코드를 코딩하는 방법에 대한 몇 가지 예를 제공합니다. 코드 조각은 실행 가능한 메모리에서 직접 선택됩니다. 따라서 NX 비트는 우리를 막을 힘이 없습니다.

더 자세히 보기: 이제 예제를 살펴보겠습니다: 함수X라는 가상의 시스템 함수를 사용하면 두 개의 인수 x와 y를 사용하며 y가 작동하려면 반드시 0 또는 null이어야 합니다. ASLR의 바이패스는 원하는 모듈의 부하 주소(예: 커널32.dll)를 결정하고 전체 ROP 체인에 대해 적절한 주소를 생성함으로써 가능합니다. 예를 들어 RDI와 RSI를 모두 제어해야 하는 경우 프로그램에서 다음과 같은 두 개의 가젯을 찾을 수 있습니다(rp++ 또는 ROPgadget과 같은 도구를 사용):이 예제에서는 몇 가지 중요한 트릭을 보여 줍니다.

Comments are closed.