Hacking/Reversing / / 2016. 5. 11. 20:38

[리버싱] 함수의 에필로그, 함수 호출 규약


리버싱을 하려고 디버거에 바이너리를 올려놓고 제일 먼저 해야할것은 각 함수가 뭘하는지. 역할을 파악하는 것이다


그러고 난 뒤엔, 어떤식의 함수인지 인자는 몇개를 전달하는지에 대한정보를 파악 해야한다


대체로 함수는 


push ebp

mov ebp,esp


~


mov esp,ebp

pop ebp


으로 시작과 끝을 맺으며 이 에필로그가 보인다면 하나의 함수라고 보면된다. 이 어셈블리코드는 스택을 쓰기위함이다


함수의 호출 규약


함수 호출 규약에는 자주쓰이는 4가지 호출규약이 있다. 


_cdecl , _stdcall , _fastcall , _thiscall


함수 호출 규약을 알게되면, call문을 통해 인자와 함수에 대한 중요내용을 파악하기 쉽기 때문이다.


먼저 _cdecl 방식을 살펴보겠다. _cdecl방식은 C언어 에서 많이 쓰인다.


_cdecl의 가장 큰 특징은 메인함수에서 함수를 call하고 add등으로 스택을 다시 채워줌으로써 보정하는 특징을 가지고있는데, 이 보정하는 스택의 크기로 파라미터의 개수까지 알수있다. 


예로 add esp,8 라 한다면 4바이트씩 2번 파라미터가 2개인 함수라는것 말이다 !  그리고 함수가 끝날때 리턴해주는 값도 주시해야하는데. 실전에서 더 알아보도록하고 넘기자


두번째로 _stdcall방식을 알아보자. 


_stdcall방식의 특징은 _cdecl이 함수를 콜한뒤 종료시키고 ret으로 돌아와서 스택을 보정했다면. _stdcall의 특징은 콜 된 함수안에서 스택이 보정된다. 예로 _cdecl이 add esp,8로 파라미터가 2개라는걸 알았다면, _stdcall방식은 함수의 마지막에 리턴값에 return 8  이런식으로 보정을 한다!(뒤에 오는 숫자(8)은 16진수 이다) _stdcall방식은 특히 중요한데, Win32 API가  _stdcall방식을 사용하기 때문이다. 


※ return뒤에 숫자가 없고 함수가 끝난뒤 돌아온뒤에도 스택보정을 하지않는다면 이 함수는 _stdcall방식이며, 파라미터가 0개라는 함수라는 것을 알수있다!


세번째로 _fastcall방식을 알아보자


_fastcall방식은 함수가 콜된후 함수안에서 sub명령으로 스택의 크기만큼 빼고 시작한다. (버퍼를 주고 디버깅을 해보면  먼저 sub로 빼고 시작하는데 같은방식인가..?)


예를들면, 


push ebp //함수 에필로그

mov ebp, esp // 함수 에필로그

sub esp, 0Ch


이런식으로 말이다. 


​그리고 _fastcall은 ​함수의 파라미터가 2개이하 이면 인자를 push하지 않고 eax,ecx같은 레지스터를 이용한다. 메모리보다 레지스터를 이용하는게 훨씬 빠르기 때문이다.


이런식으로 함수 호출전에  레지스터에 인자를 먼저 넣고 함수를 호출한다


main:

push ebp

mov ebp,esp

mov ecx ,2

mov eax ,1

call (function)

이런식으로 말이다.


함수호출전에 인자를 레지스터에 넣는게 보인다면 _fastcall이라고 생각하자 (말그대로 빠르게 콜하넴ㅋㅋ)


마지막으로 _thiscall 이다


_thistcall은 c++의 클래스에서 이용되는 방법이다. 


가장 큰 특징으로는 현재객체의 포인터를 ecx에 전달해준다. 


클래스는 객체지향프로그래밍의 개념으로써, 하나의 클래스를 선언해두면 얼마든지 여러개의 객체를 만들어 쓸 수가 있다.


기본 인자전달방법이나 스택처리방법은 _stdcall과 다를게 없지만 c++에서 특징을 보인다.


한마디로 ecx로 전달되는값이 this포인터가 된다.


이렇게 함수의 기본 호출 규약 4가지를 알아보았다. 각 함수의 인자전달방식이나 파라미터를 알아보기 위해선 꼭 필요하다고 생각한다







(출처: 나의 네이버 블로그 http://blog.naver.com/artists2/220352951567)

'Hacking > Reversing' 카테고리의 다른 글

Abex's Crackme #5 분석  (0) 2019.12.02
PE File Format - (1)  (0) 2016.09.26
[리버싱] Visual Basic 파일 특징  (1) 2016.05.04
[리버싱] IA-32 레지스터의 종류 (기초)  (0) 2016.04.28
[리버싱] Messagebox 문자열 패치  (0) 2016.04.28
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유