Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Create a UAF vulnerability(Fake chunk)

  • 앞에서 설명한 
  • Computer Class에 저장되는 값(vtable addr)을 변경하기 위해서는 UAF 취약성을 이용해야 합니다.
    • Player가 입력한 좌표값은 Board영역에 비트 값(01,10)으로 저장되고 있습니다.
    • Game board 정보는 Heap 영역, gameinfo 전역변수에 저장되고 있습니다.
    • Overflow를 통해 할당해제 할 메모리 주소 값을 변경할 수 있습니다.
  • 설명한 취약성을 이용해 UAF 취약성을 만들 수 있습니다.
    • 공격 대상은 AI Class의 vtable 입니다.
    • OmegaGo() 함수에서 AI Class의 vtable 공간으로 8 byte를 요청하고 있습니다.
      • 해당 Chunk의 크기는 0x20이 됩니다.
      • Chunk header(0x10) + Base heap area(0x10)
    vtable 정보를 저장하기 위해 생성되는 Heap의 크기는 0x20byte 입니다.
    • 즉, UAF취약성을 생성하기 위해서 0x20 byte의 fake chunk가 필요합니다.
Code Block
languagecpp
titleomegaGo
...
  AI = (Method *)operator new(8uLL);
  AI->Play = 0LL;
  setAIFunction(AI);
  player[0] = AI;
  HUMAN = (Method *)operator new(8uLL);
  HUMAN->Play = 0LL;
  setHUMANFunction(HUMAN);
...
  • 다음과 같은 구조로 Fake chunk를 생성할 수 있습니다.

0x00x8
0x00

0000000000000000

0000000000000000
0x1000000000000000000000000000000020
0x2000000000000000000000010000000000
0x3000000000000000000000000000000020
0x4000000000000000000000000000000000
0x5000000000000000000000000000000000
0x600000000900000009000000000000004F
0x7040665799D0203E644066800000000000
0x8000000000000000000000000000000031

...