Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공부일지

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

공부일지/정리하기

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로 호출했을까 라는 의문이 들었지만

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

'공부일지 > 정리하기' 카테고리의 다른 글

PLT와 GOT (+return to dl resolve)  (0) 2019.06.22
오브젝트 파일와 링킹  (0) 2019.06.14
어셈공부 -1  (0) 2019.05.01