glibc-2.23 & glibc-2.27
# 함수 살펴보기
calloc() 함수는 각각 크기 바이트의 nmemb 요소 배열에 대해 메모리를 할당하고 할당된 메모리에 포인터를 반환한다. 메모리가 0으로 설정되어 있다. nmemb 또는 크기가 0이면 calloc()가 NULL을 반환하거나 나중에 free()로 성공적으로 전달할 수 있는 고유한 포인터 값을 반환한다.
allocate 함수 malloc, calloc, realloc 중
calloc은 동적할당 시 메모리를 초기화하고 할당하는 함수이다
# 흐름
취약점을 직접 눈으로 확인해보기 위해 아래와 같은 코드를 작성하고
calloc의 내부 루틴을 보기 위해 main+78 에 break point를 걸었다
이후 진행되는 내부루틴을 보기전에 malloc_hook의 값을 임의의 값(0x61616161 61616161)로 덮어두고
어떤 일이 발생하는지 살펴보자
si 명령어 입력 후 마구 넘기다가 보면
갑자기 프로그램이 죽어버린다
그 이유를 분석해보면
call rax 를 진행하다가 죽었는데
rax 에는 malloc_hook 에 덮었던 값이 남아있는 것이 보인다
또한 rbp 레지스터에는 0x100값이 들어있는데
잘 생각해보면 calloc 함수에 size로 지정해준 값인 0x100이다
정리해보면 calloc이 호출되는 내부 루틴에는
size 값을 rbp 레지스터에 저장한 뒤
malloc_hook 에 있는 값을 call 하는 부분이 있다.
만약 size값을 조작할 수 있고
malloc_hook에 leave_ret gadget을 덮을 수 있다면
calloc 내부 루틴에 의해 rsp control을 할 수 있는 것이다
" ROP 가능 "
# 사용 예시
https://sf-jam.tistory.com/69
[ 13 ] CVA : Calloc Vulnerabilty Attack
sf-jam.tistory.com
'System Hacking > Study Notes' 카테고리의 다른 글
Large bin attack (0) | 2020.05.04 |
---|---|
About Strtok (0) | 2020.04.29 |
내 힙(heap) 어때? (0) | 2020.04.06 |
pwndbg> command (0) | 2020.01.13 |
Extra Segment & Exit (with. FSB) (0) | 2020.01.13 |