티스토리 뷰

Memo

c++ name mangling

marshimaro aSiagaming 2017. 7. 10. 19:33

c++로 컴파일된 바이너리들을 보다보면, 함수의 이름이 되게 이상하게 보이는 경우들이 있다.


   0x080487c8 <+85>: call   0x8048870 <_ZNK5Point12ShowPositionEv>

   0x080487cd <+90>: add    esp,0x10

   0x080487d0 <+93>: sub    esp,0xc

   0x080487d3 <+96>: lea    eax,[ebp-0x18]

   0x080487d6 <+99>: push   eax

   0x080487d7 <+100>: call   0x8048870 <_ZNK5Point12ShowPositionEv>

   0x080487dc <+105>: add    esp,0x10

   0x080487df <+108>: sub    esp,0xc

   0x080487e2 <+111>: lea    eax,[ebp-0x20]

   0x080487e5 <+114>: push   eax

   0x080487e6 <+115>: call   0x8048870 <_ZNK5Point12ShowPositionEv>

   0x080487eb <+120>: add    esp,0x10

   0x080487ee <+123>: mov    eax,0x0

   0x080487f3 <+128>: mov    ecx,DWORD PTR [ebp-0x4]

   0x080487f6 <+131>: leave

   0x080487f7 <+132>: lea    esp,[ecx-0x4]

   0x080487fa <+135>: ret

End of assembler dump.

gdb-peda$



예를 들면, 위와 같이 저런식으로 이름이 굉장히 이상하게 보인다.

왜 저런식으로 이름이 이상하게 만들어지는가???


-> c와는 다르게 c++에서는 overloading이라는 것이 가능하다.

그것이 클래스가 되었건, 함수가 되었건, 연산자가 되었건...


컴파일 시점에서 생각해보면, 만약에 같은 이름으로 함수가 2개이상 설정되어 있으면 이것을 어떻게 구분을 할 것인가???

이 문제를 해결하기 위해 나온 것이 name mangling이다.


컴파일러는 함수같은 것에 대해서 컴파일 시점에 symbol을 생성하게되는데, 이 symbol은 무작위로 만들어지는 것이 아닌, 

함수의 이름, parameter를 어느정도 고려하여서 만든다.


-> 컴파일러마다 조금씩은 symbol을 생성하는 과정이나 그런게 다르다.




'Memo' 카테고리의 다른 글

pwntools dependency error  (0) 2017.07.15
python pwntool 디버거 붙이기  (0) 2017.07.12
c++ name mangling  (0) 2017.07.10
c Language if문 boolian  (0) 2017.07.03
binary ninja command  (0) 2017.06.30
멍청했다  (0) 2017.06.13
댓글
댓글쓰기 폼