공부일지/정리하기

getchar함수의 내부루틴 간단정리

ptosat144 2019. 7. 6. 22:43

 

힙구조를 공부하려고 실습을하려고 예제파일을 만들어서 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로 호출했을까 라는 의문이 들었지만

구글링을해도 아직 이렇다할 답을 얻지 못했다..