본문 바로가기

High Level Technique/Reversing

64비트에서 달라진 점

64비트에서 달라진 점



대부분 32비트 환경에서 리버싱을 해오면서 64비트는 단순히 주소만 확장되어 사용되고, 레지스터가 조금 달라졌다. 이정도 수준만 알고 리버싱을 했었습니다.

책을 보면서 몰랐던 부분들도 많이 있어서 정리해 두면 좋겠다 싶어 작성합니다.



64bit CPU


intel에서 64bit CPU인 IA-64를 만들면서 64bit에 강력한 성능을 뽑아냈습니다. 하지만 기존의 32bit와는 호환이 되지 못해서 사실상 사람들이 많이 사용하지 못했죠.

그러던 중 AMD에서 32bit와 호환이 되는 AMD64를 만들게 되었고 사람들이 많이 사용했습니다. 이것을 intel이 라이센스를 사들여서 intel64로 바꾸게 됩니다.






Win32 API


64bit 프로그램을 만들 때 기존의 win32 API를 그대로 사용합니다.  win64 API를 제공하지 않죠. 나중에 64비트의 환경이 어느정도 만들어 진다면 win64 API도 공개 될 것 입니다.





WOW64


64bit OS에서 (특히 Windows) Programfile과 Programfile(x86) 또 WOW64라는 것을 보신분들이 계실겁니다.

64bit에서도 32bit 프로그램이 돌아가는데 호환이 되게 하기 위해서 WOW64를 만들어 둔 것입니다.






64bit 레지스터


64비트 레지스터는 기존 32bit에서 더 확장되어 사용됩니다. EAX, EBX 등의 레지스터들이 RAX, RBX 형식으로 사용됩니다.

또한 64비트에서는 R8 ~ R15 레지스터가 추가되었고, Segment Register는 사용되지 않습니다. 32비트 호환용으로만 제공되죠.





함수 호출 규약


64bit에서는 변형된 fastcall 하나로 만들어졌다고 합니다. 

32bit에서는 cdecl, stdcall, fastcall등이 존재했었습니다. 


64비트에서 파라미터는 RCX, RDX, R8, R9 순서로 들어가게 되며, 실수형일 경우 XMM0, XMM1, XMM2, XMM3 순서로 들어가게 됩니다.

파라미터가 5개가 넘어가는 경우 5번째 부터 스택에 저장시켜 전달합니다.






스택 / 스택 프레임


32bit 프로그램에서는 PUSH POP과 같은 명령어들이 많이 나타나지만 64bit 프로그램에서는 PUSH POP 명령어들이 거의 보이지 않습니다.

스택 프레임을 구성하는데도 RBP레지스터를 이용하지 않고 RSP  레지스터를 이용하여 구현합니다.