본문 바로가기

calloc without memset ..

@eouya22025. 10. 27. 22:51

calloc .. calloc.....

calloc() 함수는 tcache bin을 사용하지 않는다. 해제하면 tcache로 들어가긴 하지만, tcache에 몇개의 청크가 차있어도 calloc()을 이용해 할당 받으면 tcache에서 재활용 하지 않고 새로 할당 받는다. 그래서 대부분 calloc을 사용하는 문제는 fastbin, unsorted bin을 이용한다. 또한 내부적으로 memset()을 사용해서 할당 받는 청크 영역을 0으로 초기화 해주게 된다. 이때문에 유효 값 leak이 힘들어지기도 한다.

 

만약 calloc시 memset을 호출하지 않는다면 청크의 데이터가 그대로 남아있어 leak하기 좀 수월할 것이다. 이는 청크의 size field를 조작할 수 있을 때 memset 호출을 우회하는 것이 가능하다. IS_MMAPED(0x2) flag를 설정해주면 된다.

 

ex) sizefiled가 기존 0x0000000000000021이면 -> 0x0000000000000023

청크가 해제된 상태에서 IS_MMAPED flag가 설정되어 있는 상태로 calloc으로 할당 받으면 memset이 호출되지 않고 데이터는 그대로 남아있게 된다.

 

IS_MMAPED flag 없을 시

할당 전
할당 후

IS_MMAPED flag 있을 시

할당 전
할당 후

 

 

fastbin_dup_consolidate()

이 기법은 fastbin에 있던 청크들을 smallbin에 넣어서 DFB를 우회할 수 있는 기법이다.

fastbin에 청크가 있는 상태에서 large bin size의 청크를 할당하게 되면 malloc_consolidate()를 호출하고 fastbin에 있던 청크들이 small bin으로 들어가게 된다. 혹은 가능하다면 Top chunk를 모두 소진하게 하면 된다. small bin으로 보낸 후 다시 같은 청크를 해제하면 fastbin으로 들어가게 되어 DFB가 발생한다. 또한 청크 병합을 방지하여 fastbin에 넣은 상태로 진행하면,

small bin에 여러 청크가 연결리스트를 이루게 되고, 이 small bin에는 Safe-linking이 적용되지 않기 때문에 heap이나 libc leak 하는데에도 유용하게 사용할 수 있다.

 

 

libc GOT overwite (strlen) glibc <= 2.35

이거 몰라서 몇시간 날려먹은 것 같은데

printf 내부에서 libc 영역 내 strlen got를 참조하게 되는데, strlen -> system으로 overwrite 하였을 때

printf("포맷", 인자2); 이렇게 호출하면 strlen(인자2) -> system(인자2)이런식으로 호출된다.

따라서 printf 호출할 때 두 번째 인자에 /bin/sh을 넣어주면 쉘 획득이 가능하다.

'PWN > 개념' 카테고리의 다른 글

_IO_cleanup, _chain 조작을 통한 FSOP  (0) 2025.12.12
House of botcake  (0) 2025.10.31
docker process에 gdb attach 방법 그 외  (0) 2025.09.30
fflush() 이용한 libc leak, 그 외  (0) 2025.09.11
fastbin attack시의 size check  (0) 2025.09.08
eouya2
@eouya2 :: eouya2

개인공부 기록 / 틀린거 있으면 돌팔매질 부탁드립니다

목차