64bit Calling Convention


64비트는 리눅스와 윈도우의 인자 전달 방식이 나뉘어 집니다.

이를 적응 하느라 꽤 시간이 걸렸는데 


우선 리눅스는 파라미터를 전달할 때 6개의 레지스터를 사용합니다.


RDI : 첫번째 인자

RSI : 두번째 인자

RDX : 세번째 인자

RCX : 네번째 인자

R8 : 다섯번째 인자

R9 : 여섯번째 인자


이렇게 6개의 레지스터를 사용하고 인자가 7개 이상일 경우부터는 스택을 같이 사용합니다.


윈도우는 그에비해 파라미터를 전달할 때 레지스터를 4개까지 사용합니다.


RCX : 첫번째 인자

RDX : 두번째 인자

R8 : 세번째 인자

R9 : 네번째 인자


이렇게 4개의 레지스터를 사용하고 인자가 4개이상일 경우에는 스택을 같이 사용합니다.



64bit stack frame


64비트 OS에서는 스택과 스택 프레임을 사용하는 방식이 변경되었는데 우선 함수에서 실제 필요한 크기보다

훨씬 크게 스택을 미리 확보합니다. 서브함수를 호출할 때는 push 명령을 썼던 기존과는 달리 미리 확보한 스택에 mov 명령을 통해 전달해줍니다. 또한 스택 프레임을 구성할 때도 RBP 레지스터를 이용하는 것이 아니라 RSP 레지스터를 이용하여 구현합니다.



'Security' 카테고리의 다른 글

c++ vtable 리버싱  (0) 2014.01.31
ROP 자료  (1) 2013.11.20
Native API를 이용한 static 안티 디버깅 정리  (1) 2013.11.10
안티디버깅 간단 정리  (1) 2013.10.30
바인드쉘, 리버스쉘  (0) 2013.10.24
Posted by xer0s :