System Hacking/Basics

힙 실습 정리 1

hanbunny 2025. 4. 30. 01:58

tcachebins LIFO 확인

malloc 0x10 을 2번 주고 free로 다시 해제해줌.

tcachebins를 보면 먼저 해제해준 chunk가 들어가있음.

그리고 다시 malloc을 해주면 마지막에 해제된 영역이 할당됨.

-> LIFO 

 

 

리스트 구조 확인

이번에는 3개를 할당/해제 해줌.

각각 해제된 영역을 보면 fd에 이전에 해제된 chunk가 적혀있음.

가장 처음에 해제된 영역엔 fd에 0이 들어있음.

 

tcache arena 영역 확인

그리고 주소들 앞을 보면 [ 3] 이렇게 해제된 chunk의 개수가 적혀있는데,

tcache arena안에서도 확인 가능함.

그리고 마지막에 해제된 chunk가 적힘.

만약 저게 할당되면 다음에 있는 chunk가 적히고 개수는 줄어듬.

 

tcachebins 사이즈 별 관리

다른 사이즈(0x20)로 malloc을 줘봄.

0x10으로 줬을 땐 0x20만큼 할당을 받았는데, 0x20을 주니까 0x30을 받음.

왜임? 헤더 크기 0x10만큼을 계산해서 줌.

0x28은 0x30

0x29는 0x40

왜임? prev_in_size를 넘쳐서 다음 청크까지 침범해버림.

 

다시 tcache arena를 확인해보면 개수를 쓰는데 2바이트씩 차지하고 있고 사이즈마다 개수가 적힘.

그리고 아까 0x20사이즈에서 마지막으로 해제된 chunk 옆에 0x30 chunk 사이즈도 적혀있음.

 

tcachebins 개수 제한

이번엔 10개 할당하고 해제해봄.

 -> tcachebins에는 최대 7개까지만 들어가는 걸 알 수 있고, 그 이후로 해제된건 fastbins로 들어감.

 

 

Top chunk 와 병합

그냥 0x410을 할당하고 해제하면 bins 어디에도 저장되지 않음.

어디감? top chunk에서 떼준 영역을 써서 다시 top chunk로 돌아감.

tcache는 자기랑 사이즈가 맞는 chunk만 주기 때문에 사이즈가 크면 못 받음.

이제 Top chunk와 인접하지 않아서 해제해도 병합되지 않음.

그럼 해제되면 어디로감?

unsortedbin안에 들어가있음.

그리고 fastbins에 있던건 다 사라짐? 왜? 모름..찾아보삼

 

unsortedbin

unsortedbin에 해제된 chunk를 보면 fd, bk 둘 다 확인 가능.

지금은 chunk가 하나라 한 chunk만 가리키고 있어서 같은게 적혀있음.

그리고 unsortedbin은 한 번의 재할당 기회를 가짐.

사이즈가 달라도 그냥 필요한 사이즈만큼 떼주기도함 -> 잘라서 준 만큼 줄고 나머지는 그대로 남아있음.

재할당이 안 되면 다른 bin으로 이동함 -> 떼서라도 할당되면 남아있음.

 

'System Hacking > Basics' 카테고리의 다른 글

힙 실습 정리2  (0) 2025.04.30
docker 정리  (1) 2025.04.28
Heap힙 /ptmalloc  (0) 2025.04.28
malloc / 메모리사용  (0) 2025.04.27
C언어 포인터 복습  (0) 2025.04.27