HanJeouk의 개인공부 블로그

도움이 많이 됐던 문서: Lazenca 님의 블로그

문서링크는 House_of_einherjar  [출처: shellphish]


청크 a(0x38),b(0xf8)를 할당한다.

스택(Bss 영역이나 Heap 영역의 주소를 안다면 그곳에 해도 된다.)에 fake chunk 를 만든다. 

(청크 구조: prev_size(0x100) | size(0x100) | fd(&fake_chunk) | bk(&fake_chunk)) 

(prev_size 를 0x100으로 하는 이유는 P->bk->size == P->prev_size  를 우회하기 위해서다.)

(size를 0x100으로 하는 이유는 size를 small bin으로 유지시키기 위함이다.)


이제 Overflow 를 이용해서 청크 b의 Header를 조작해야 한다.

b는 0xf8로 할당했을 때 gdb로 chunk 구조를 보면 사이즈가 0x101(Prev_size[4 byte] + size[4 byte] + prev_inuse[1 byte] + data[0xf8]) 이 된다. 

그렇게 된다면 overflow 로 header를 조작할 때 사이즈인 0x101 에서 prev_inuse 인 1만 빼주면 0x100으로 간단하게 조작할 수 있게 된다. 

size는 그렇게 해주고 prev_size를 조작하는 게 중요하다. 왜냐하면 병합할 때 prev_size를 기준으로 병합하기 때문이다.

Unlink를 할 때 &chunk - prev_size를 한 주소에서 병합이 된다. &b는 청크 b의 데이터영역의 주소다. 0x10을 빼는 이유는 헤더부분을 제외하기 위해서다. &b-0x10 = &b_address 라고 하겠다.

 prev_size는&b_address - &fake_chunk 를 해준다. (설명: 계산을 했을 때 &b_address - &fake_chunk = offset 라고 가정을 하고 이 offset을 prev_size라고 설정하고 나중에 b를 free하게 되면 &b_address -  offset 을 했을 때 &fake_chunk가 된다.

a-b = c 일 때 a-c = b와 같은 원리이다.)

그리고 offset을 fake_chunk의 size에 넣어준다. 그러면 size(P) == prev_size(next_chunk(P)) 부분을 우회하게 된다.

이제 다시 할당하면 스택에 할당이 된다.



'Documents > how2heap' 카테고리의 다른 글

how2heap house_of_force  (0) 2018.02.20
how2heap unsorted_bin_attack  (0) 2018.01.17
how2heap poison_null_byte  (0) 2018.01.16
first_fit & unsafe unlink  (0) 2018.01.08
fastbin_dup & fastbin_dup_into_stack  (0) 2018.01.03