create(0x40, b'AAAA') create(0x40, b'BBBB') create(0x40, b'CCCC') delete(0) delete(1) delete(2) modify(2, 0xa, b'B'*8 + b'\x00')
위 코드에서 delete(2)를 실행 한 후 heap을 보면 3개가 free되어있는데, modify를 실행한 후 heap을 보게되면
`Allocated chunk | PREV_INUSE
Addr: 0x21fb250
Size: 0x51
Allocated chunk | PREV_INUSE
Addr: 0x21fb2a0
Size: 0x51
Free chunk (tcachebins) | PREV_INUSE
Addr: 0x21fb2f0
Size: 0x51
fd: 0x4242424242424242`
위와 같이 두개가 할당되어 있습니다.
이유가 뭔가요??
안녕하세요,
일반적인 chunk의 경우 자신의 다음 주소에 있는 chunk의 PREV_INUSE
플래그가 꺼져 있는지 확인해서 자기 자신이 free가 되어 있는지 확인하는 것이 가능합니다. ptmalloc에서는 PREV_INUSE
를 확인하고 이전 청크와 현재 청크를 병합(consolidate)하기 때문에 중요한 값이라고 할 수 있습니다.
하지만 tcache나 fastbin에 들어가는 chunk의 경우 해당 chunk는 가까운 미래에 재사용이 될 예정이라고 간주해 병합의 대상으로 보지 않으며, 다음 주소의 chunk의 PREV_INUSE 플래그는 항상 켜져 있게 됩니다. 그렇기에 tcache나 fastbin에 들어가 있는 청크가 tcache나 fastbin으로부터 벗어나게 되면 해당 청크는 사용 중인 청크로 판단할 수 밖에 없게 됩니다.
해당 경우 tcache -> 0x21fb2f0 -> 0x21fb2a0 -> 0x21fb250
순으로 가리키고 있는 상태에서 0x21fb2f0
이 0x4242424242424242
를 가리키게 되었기 때문에, 나머지 두 청크는 더 이상 tcache에 연결되어 있지 않아 위와 같이 표시된 것입니다.