상세 컨텐츠

본문 제목

02.Frame Pointer Overwrite(One-byte Overflow) - x64

본문

BackGround

해당 취약성은 다음과 같은 구조에서 발생한다.

  • vuln() 함수에서 Overflow로 인해 main() 함수의 Frame Pointer를 1 byte 변경 할 수 있다.

  • vuln() 함수가 종료 될 때 변경된 Frame Pointer는 leave 명령어에 의해 RBP 레지스터에 저장된다.

  • main() 함수가 종료 될 때 RBP 레지스터에 저장된 Frame Pointer는 leave 명령어에 의해 RSP 레지스터에 저장된다.

  • 즉, 이로 인해 ret 명령어에 의해 이동할 영역을 변경 할 수 있다.
    • 공격하는 형태는 Frame faking과 동일 하다.
    • 단, Frame faking은 Return Address 영역까지 Overflow 했으나, FPO는 Frame Pointer의 1 byte를 Overwrite 한다.

Proof of concept

  • 해당 프로그램은 Stack address, Libc address를 출력한다.
    • Stack address: buf
    • Libc address: printf_addr
  • read()함수를 이용해 사용자로 부터 49개의 문자를 입력 받는다.
    • 이로 인해 Frame pointer영역에 1byte를 Overwrite 할 수 있다.

  • vuln() 함수에서 사용 할 Frame Pointer 주소는 0x7fffffffe1f0 이다.
  • 해당 영역에는 다음과 같은 정보가 저장되어 있다.
    • 0x00007fffffffe210 : main() 함수의 Frame Pointer
    • 0x40079b: vuln() 함수 종료 후 이동할 Return Address

다음과 같이 Frame Pointer 영역의 Overwrite를 확인 할 수 있다.

  • 문자 49개를 입력하여 main() 함수의 Frame Pointer 주소 값이 1byte 변경되었다.
    • 0x00007fffffffe210 → 0x00007fffffffe241
  • 해당 값은 leave 명령어에 의해 RBP 레지스터에 저장된다.

다음과 같이 코드 흐름의 변경을 확인 할 수 있다.

  • leave 명령어로 인해 RBP 레지스터의 값은 RSP 레지스터에 저장되며, 이로 인해 프로그램의 흐름이 변경될 수 있다.
  • 즉, 1 byte를 변경하여 RTL 코드 또는 Shellcode가 저장된 영역을 가리킬수 있다면 코드의 흐름을 변경 할 수 있다.

EXPLOIT

다음과 같은 상황이 발생 할 수 있다.

  • RTL 코드가 저장된 영역과 Frame Pointer의 뒤에서 3번째 자리의 수가 다르면 공격에 성공 할 수 없다.

  • 즉, 다음과 같은 환경(주소)에서는 FPO 공격이 성공 할 수 없다.

    • buf[32] Address : 0x7ffff7e7c3b0

    • Frame Pointer address of main() function : 0x7ffff7e7c3b0 + 0x50 = 0x7ffff7e7c400

 

 

REF: https://www.lazenca.net/display/TEC/02.Frame+Pointer+Overwrite%28One-byte+Overflow%29+-+x64

 

02.Frame Pointer Overwrite(One-byte Overflow) - x64 - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List Frame Pointer Overwrite(One-byte Overflow) Frame Pointer Overwrite란 Frame point에 1byte를 덮어써서 프로그램의 실행 흐름을 제어하는 것입니다. LEAVE, LEAVE instruction 해

www.lazenca.net

 

관련글 더보기

댓글 영역