Search

House of Force 분석

Tag
heap
Create time
2020/04/20

1. House of Force 사용 조건

원하는 사이즈를 malloc을 통해 할당받을 수 있어야 함
Top 청크의 size 부분을 수정가능해야함.
이러한 환경이 갖춰진다면, House of Force를 이용하여 원하는 공간에 원하는 값을 쓸수가 있다.

2. House of Fouce 기법이란?

... /* finally, do the allocation */ p = av->top; size = chunksize (p); /* check that one of the above allocation paths succeeded */ if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE)) { remainder_size = size - nb; remainder = chunk_at_offset (p, nb); av->top = remainder; set_head (p, nb | PREV_INUSE | (av != &main_arena ? NON_MAIN_ARENA : 0)); set_head (remainder, remainder_size | PREV_INUSE); check_malloced_chunk (av, p, nb); return chunk2mem (p); } ...
C
복사
현재 요청한 사이즈를 처리해줄 수있는 청크가 bin list에 없을때 위 코드 로직이 실행된다. 현재 Top 청크가 요청한 사이즈보다 크다면, Top 청크를 잘라서 할당을 해주고 Top 청크는 요청한 사이즈만큼 줄어들게 된다. 아래 사진을 봐보자
현재 malloc(0x80) 하나만 되어있는 상황이다. top 청크의 주소는 0x602090이고 사이즈는 0x20f70이다. 이 상태에서 malloc을 한번더 하게 된다면, binlist에 아무것도 없기 때문에, Top 청크를 잘라서 할당해줄 것이다
원래 Top 청크 사이즈가 0x20f71 이였는데 여기서 0x90 만큼 빼서 할당을 해주고, Top 청크 주소에 들어간다. 그리고 Top 청크는 0x90 만큼 밑으로 내려간다.
여기서 만약 Top 청크 사이즈를 수정하여 0xffffffffffffffff 으로 변경이 가능하다면, 원하는 만큼 청크 사이즈를 요청 가능하다. 그리고 여기서 특정 사이즈를 malloc 요청하게 된다면, 탑 청크는 현 주소에서 + 요청한 사이즈만큼 더한값이 새로운 탑청크가 된다.
예를 들어 0x602120 + 요청사이즈가 0xffffffffffffffff 을 넘어가게 된다면, 오버플로우로 인해 0x0 부터 다시 값이 시작하게 되는데, 이를 이용하여 적절히 오프셋을 맞춰주면, 원하는 공간을 Top 청크의 주소로 변경시킬 수 있고, 이 후에 한번더 malloc을 하게 된다면, 현 탑청크의 주소가 새로 요청한 malloc의 주소가 될 것이다. 오프셋을 다음과 같이 계산하면 된다.
할당받기 원하는 주소 - 청크 헤더사이즈(0x10) - 현재 탑청크 주소 - 청크 헤더사이즈(0x10)
Markdown
복사
0x10을 빼주는 이유는 청크의 헤더가 포함되기 때문이다. 만약 우리가 0x601010부분에 들어있는 값을 변경하고 싶으면 0x601000 주소를 탑청크로 변경해야지, 실질 데이터가 0x601010부터 들어가기 때문이다.
그럼 이러한 기법을 이용하여 문제를 해결해보자. 풀이는 다음링크에서 확인 가능하다