상세 컨텐츠

본문 제목

03.ROP(Return Oriented Programming) - mmap, mprotect

본문

ROP(Return Oriented Programming) - mmap, mprotect

 

  • ROP를 이용하여 메모리 영역을 할당(mmap)하거나 할당된 메모리 영역의 권한을 변경(mprotect)하는 방법에 대해 설명하겠다.
    • 이외에도 ROP를 이용하여 공격자가 원하는 다양한 코드를 작성할 수 있다.
  • 일부에서는 mmap(), mprotect()를 이용하여 메모리를 다루는 것을 ROP Stager라고 표기하고 있다.

 

mmap - 32bit(feat. POPAD, PUSHAD)

Proof of concept

다음과 같이 Overflow를 확인할 수 있다.

  • Return address - buf 변수의 시작 주소 = 66

  • 즉, 66개 이상의 문자를 입력함으로써 Return address 영역을 덮어 쓸 수 있다.

Exploit 순서

  • mmap() 함수를 이용하여 RWX 권한을 가지는 메모리 영역 생성
    • mmap(0x20000000,0x1000,0x7,0x22,0xffffffff,0)
  • memcpy() 함수를 이용하여 shellcode를 mmap() 함수로 생성한 영역에 복사
    • memcpy(0x20000000,'address of shellcode',len(shellcode))

memcpy()

  • Exploit code에서 사용할 Libc의 memcpy() 함수는 Memory의 값을 복사하지 못한다.
    • Libc의 memcpy() 함수는 CPU가 지원하는 스트리밍 SIMD 확장(Streaming SIMD Extensions, SSE)에 맞는 함수의 주소값을 리턴한다.

      • 스트리밍 SIMD 확장(Streaming SIMD Extensions, SSE) 종료 : SSE, SSE2, SSSE3, ...

    • 즉, Libc의 memcpy() 함수를 호출하면 Memory 값을 복사하는 함수의 주소는 EAX 레지스터에 저장된다.

POPAD, PUSHAD

  • 테스트 환경이 x86이기 때문에 POPAD, PUSHAD 명령어를 이용하여 ROP 코드를 작성한다.
  • POPAD, PUSHAD명령어는 다음과 같은 동작을 한다.
instruction description
POPAD
  • 스택에 존재하는 값을 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 레지스터에 저장합니다.

  • PUSHAD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용할 때 사용한다.

PUSHAD
  • EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순으로 레지스터의 값을 스택에 저장합니다.
  • 레지스터들의 값을 보관해야 할 때 사용한다.

 

ROP code

  • ROP의 구조는 다음과 같다.
    • mmap() 함수를 이용하여 새로운 메모리 영역을 할당받는다.
    • POPAD Gadget에 의해 memcpy() 함수의 주소가 저장된 영역으로 이동한다.
    • XCHG EAX,EDI Gadget에 의해 리턴받은 memcpy() 함수의 주소를 EDI 레지스터에 저장한다.
    • POP ESI Gadget에 의해 memcpy()함수 호출 후 이동할 return address를 ESI 레지스터에 저장한다.
    • POP EBP Gadget에 의해 1번째 인자 값을 EBP 레지스터에 저장한다.
    • POP EBX Gadget에 의해 3번째 인자 값을 EBX 레지스터에 저장한다.
    • PUSHAD Gadget에 의해 레지스터에 저장된 값들을 Stack 에 저장하고 0x1028 영역(0x1048 - (0x4 * 레지스터 개수(8))으로 이동한다.
      • 2번째 인자 값은 ESP 레지스터에 저장되어 있기 때문에 별도의 조작이 필요하지 않는다.
    • 0x1028 영역에서 memcpy() 함수로 인해 Stack에 저장된 shellcode가 mmap()에 의해 생성된 메모리 영역으로 복사된다.

Find gadget

exploit

 

 

mprotect- 64bit

Proof of concept

다음과 같이 Overflow를 확인할 수 있다.

  • Return address - buf 변수의 시작 주소 = 72

  • 즉, 72개 이상의 문자를 입력함으로써 Return address 영역을 덮어 쓸 수 있다.

Exploit 순서

mprotect() 함수를 이용하여 Shellcode가 저장된 메모리 영역의 권한을 RWX로 변경

  • mprotect()는 [addr, addr+len-1] 구간 주소 범위를 일부라도 담고 있는 호출 프로세스의 메모리 페이지들에 대한 접근 보호를 변경한다.

    • mprotect(address of shellcode,0x2000,0x7)

  • addr의 값은 페이지 경계에 맞게 정렬되어 있어야 한다.

    • Page의 크기는 4096 이다.

  • Ex)

    • 사용 불가능 : 0x7ffd0e0a4470

    • 사용 가능 : 0x7ffd0e0a4000

확인해야 할 정보 목록

  • libc offset
    • mprotect
  • 가젯의 위치
    • pop rdi,ret
    • pop rsi,ret 
    • pop rdx,ret 

Find gadget

 

exploit

 

 

REF : https://www.lazenca.net/display/TEC/03.ROP%28Return+Oriented+Programming%29+-+mmap%2C+mprotect

 

03.ROP(Return Oriented Programming) - mmap, mprotect - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List ROP(Return Oriented Programming) - mmap, mprotect ROP를 이용하여 메모리 영역을 할당(mmap)하거나 할당된 메모리 영역의 권한을 변경(mprotect)하는 방법에 대해 설

www.lazenca.net

 

관련글 더보기

댓글 영역