...
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)
- 즉, UAF취약성을 생성하기 위해서 0x20 byte의 fake chunk가 필요합니다.
Code Block | ||||
---|---|---|---|---|
| ||||
... 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를 생성할 수 있습니다.
0x0 | 0x8 | |
---|---|---|
0x00 | 0000000000000000 | 0000000000000000 |
0x10 | 0000000000000000 | 0000000000000020 |
0x20 | 0000000000000000 | 0000010000000000 |
0x30 | 0000000000000000 | 0000000000000020 |
0x40 | 0000000000000000 | 0000000000000000 |
0x50 | 0000000000000000 | 0000000000000000 |
0x60 | 0000000900000009 | 000000000000004F |
0x70 | 40665799D0203E64 | 4066800000000000 |
0x80 | 0000000000000000 | 0000000000000031 |
...