overlapping chunk
overlap technique으로 fastbin attack을 이용해도 되겠지만, 이게 더 간단하다. Poison null byte와 동일하게 off-by-one error만 발생하는 환경에서도 사용할 수 있다. 다만 overflow 되는 것이 null byte 뿐 이라면 사용할 수 없으므로 이 경우 poison null byte를 사용해야 한다.
Case 1
https://github.com/shellphish/how2heap/blob/master/overlapping_chunks.c 먼저 free(chunk)
하고 chunk.size
를 변경
1. free(p2) and then change p2.size
p1 | prev_size | |
0x111 | ||
p2 | ||
prev_size | 0x111→ 0x1a1 | |
p3 | prev_size | 0x90 |
Note ) size를 변경하면 bins가 달라지는데 이 chunk가 할당이 될까 싶지만 unsorted bin에 들어있기 때문에 된다.
next size check (fast) /next size check ( normal) 는 free()
에서 수행하는 check이므로 신경쓰지 않아도 된다. 따라서, 굳이 0x1a1
이 아니라 다른 size로 변경해도 된다.
2. p4 = malloc(0x198)
p4
가 p3
를 포함하는 chunk가 되기 때문에, p4
에 접근하여 p3
를 수정할 수 있다.
Case 2
https://github.com/shellphish/how2heap/blob/master/overlapping_chunks_2.c * p4, p5는 주석처리해도 동작함. chunk.size
를 변경하고 나서 free(chunk)
1. change p2.size and then free(p2)
p1 | prev_size | |
0x111 | ||
p2 | prev_size | 0x111→ 0x1a1 |
p3 | prev_size | 0x91 |
top size |
Note ) 먼저 p2.size
를 변경하고 free(p2)
하게 되므로 next size check에 걸리게 된다. 따라서 p2.size
에 아무 값이나 입력할 수는 없고, p2.size
번지의 값이 반드시 next size check를 통과할 수 있는 값이어야만 한다. size
를 따로 만들어주어도 되지만 보통 top size
나 pn.size
( n > 3 )를 사용하는게 편하다.
Note )top size
를 사용하는 경우, top chunk가 p2
까지 내려오기 때문에 어떤 size를 malloc(size)
하든 chunk가 p2
부터 시작한다.
2. p4 = malloc(0x198)
위에 적어놓았듯 top size
를 사용하는 경우 size가 어떻든 상관 없이 p2
에 할당된다.