공부일지
getchar함수의 내부루틴 간단정리 본문
힙구조를 공부하려고 실습을하려고 예제파일을 만들어서 heap이 할당된 메모리 맵을 보려고 하던중
malloc을 호출해서 힙을 할당하기도 전에 메모리 맵에 힙이 할당된걸 보게되었다.


위 코드 사진을 보면 malloc이 없는데도
cat /proc/pid번호/maps로 메모리 맵을 보니 저렇게 힙영역이 할당되어있었다.
아마도 저기 getchar함수 때문에 이런일이 발생하는것 같아서 간단하게 gdb로 getchar내부 함수의
흐름을 보려고한다.






getchar내부에 보면 __GI__uflow를 호출하고
__GI_ulfow에서 eax+0x14를 호출하는데 이는 __GI_IO_default_uflow함수이다
그리고 __GI__IO_default_uflow에서 $eax+0x10의 값인 __IO_new_file_underflow로
__IO_new_file_underflow에서 _GI_IO_dallocbuf를 호출한다



그리고 _GI_IO_dallocbuf에서는 __GI__IO_file__dallocate함수를 호출하고
__GI__IO_file__dallocate의 함수에서 ebp값을 스택에 넣고 0xb7e22740을 호출하게 되는데


ebp의 값은 0x400이였고


call한 0xb7e22710에서는 ebx-0xf0로 점프를 하게되는데
ebx-0xf0의 주소가 0xb7e7bf00이은

0xb7e7bf00은 malloc함수실행이였다
즉 getchar함수 내부에서 __GI__uflow -> __GI_IO_default_uflow -> __IO_new_file_underflow -> _GI_IO_dallocbuf -> __GI__IO_file__dallocate라는 과정을 거쳐서 malloc(0x400)을 호출을 하게된다
따라서 heap영역이 할당이 되어있던것이였다.
heap영역을 할당한 이유는 stdin버퍼 때문인듯한데
원래 알기로는 stdin버퍼는 스택에 위치하는걸로 아는데 더 공부가 필요한듯하다
-> bss영역에있는것은 stdin포인터였고 stdin버퍼의 위치는 heap영역이 맞았다.
이부분에 대해서도 간단하게 정리해볼예정이다
그리고 왜 0x400사이즈로 malloc로 호출했을까 라는 의문이 들었지만
구글링을해도 아직 이렇다할 답을 얻지 못했다..
'공부일지 > 정리하기' 카테고리의 다른 글
PLT와 GOT (+return to dl resolve) (0) | 2019.06.22 |
---|---|
오브젝트 파일와 링킹 (0) | 2019.06.14 |
어셈공부 -1 (0) | 2019.05.01 |