1. 메모리 구조
프로그램을 실해시키면 로더(디스크에서 주기억장치로 가져옴)에의해 프로그램이 주기억 장치인 메모리(Random Access Memory)에 적재된다. 이렇게 적재된 프로그램은 메모리상에서 스택(First In, Last Out)의 형태로 구현된다.
위와 같이 메모리에 프로그램이 적재되었을때는 크게 5가지 종류로 메모리가 나누어 져 있다.
1. CODE
-프로그램의 소스코드가 저장된다.
2-1. DATA
-전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장된다. 초기화 된 데이터는 data 영역에 저장되고
2-2. BSS
-초기화 되지 않은 데이터는 BSS (Block Stated Symbol) 영역에 저장된다.
3. HEAP
-크가가 가변한다. 프로그래머의 필요에 따라 할당하여 사용할 수있다. 위에서 부터 채워져 내려옴.
4. STACK
-크기가 가변한다. 지역변수가 저장된다. 스택에는 여러개의 스택 프레임이 존재한다. 데이터 용량의 불확실성을 가지므로 밑에서부터 채워 올림, 또한 커널영역을 침범하지 않게 하기위해 밑에서부터 채워 올림 (스택 프레임에 대한 설명은 아래 참고)
+)HEAP과 STACK이 서로 반대로 채워 나가기 떄문에 서로의 영역을 침범할 수 있음. (이를 악용해 공격도 가능하다)
HEAP overflow
-heap이 위에서부터 주소값을 채워져 내려오다가 stack영역을 침범하는 경우.
STACK overflow
-stack영역이 heap을 침범.
2. 스택프레임
어떤 함수가 호출되었을 때 그 함수가 가지는 공간 구조이다.
예를들어
void main() {
printf("Hellow");
}
위와같은 프로그램을 만들었다면 프로그램이 실행 되었을때 main()이라는 함수가호출 되고 그 다음에 printf()라는 함수가 호출 된다.
사진으로 나타내면 위와 같다.
숫서를 나타내면
프로그램 시작
main() push
printf() push
printf() pop
main() pop
프로그램 종료
위와 같다고 볼수 있다.
스택프레임은 코딩의 순서에 맞춰 LIFO 구조로 차곡차곡 쌓여진다.
이 때 esp라는 포인터가 사용되게 되는데 흔히 스택 포인터라고 하며 현재 데이터의 위치를 알려준다.
그리고 ebp라는 흔히 베이스 포인터라고 일컫는 또 다른 포인터가 있는데, 이는 스택 프레임이 시작된 위치의 주소값을 가르키며
나중에 esp가 시작점으로부터 얼마나 벗어나 있는지를 가리킨다.
스택 프레임은 해당 스택 프레임의 함수가 종료될때 함께 소멸된다.
ebp는 돌아와야 할 주소 값을 가리킨다.
참고 : https://prezi.com/obkhqdxaz3zx/programming-compile-loading-for-korean/
더 알아보기 : http://warmwrite.tistory.com/5
3.함수 호출 규약
.함수 호출 규약이란 함수가 호출 되었얼때 전달 되었던 피라미터들에 대하여 함수 호출이 끝난 후 스택을 저리하는 방법에 대한 약속이다.
즉, ESP를 정리하는 방법이다.
위 처럼 비주얼베이직에서 속성을 통해 함수 호출 규칙을 직접 정할 수도 있다. 그러면 각 방법은 무엇이 다를까?
*)용어
caller : 함수를 호출한 쪽
callee : 호출 당한 함수
1. cdcel
- 주로 C언어에서 사용 된다.
- caller(함수를 호출한 쪽)에서 스택을 정리한다.
- 장점 : 가변 길이 파라미터를 전달할 수 있다.
2. stdcall
- Win32 API에서 사용됨
- callee(호출 당한 함수)에서 스택을 정리 -> 가변인자 불가능
-함수의 호출이 끝나고 존재하는 스택 정리 코드가 없어서 비교적 빠름.
3. fastcall
-이름에서 알 수있듯이 좀 더 빠른 함수 호출을 위해 고안된 방식이다. CPU가 주기억 장치에서 인자를 불러다 쓸경우보다 레지스터에서 바로 떙겨 쓰는 것이 훨씬 빠르기 때문에 피라미터의 마지막 2개를 레지스터(ECX, EDX)를 이용해 전달한다. (나머지는 스택에 전달)
- 장점 : 좀더 빠른 함수 호출 가능
- 단점 : ECX, EDX에 대하여 백업이 필요하거나, 함수에서 ECX, EDX를 다른 용도로 써야할 경우, 파라미터를 따로 저장해야함
참고 : http://orang.tistory.com/entry/%ED%95%A8%EC%88%98-%ED%98%B8%EC%B6%9C-%EA%B7%9C%EC%95%BDCalling-Convention
http://girtowin.tistory.com/89
'리버싱(Reversing) > 보고서' 카테고리의 다른 글
리버싱 :: 64bit 에서 인자를 어떻게 전달할까? (0) | 2015.06.17 |
---|---|
리버싱 :: 함수의 시작과 끝, 함수 프롤로그, 에필로그 (0) | 2015.06.10 |
리버싱 :: 어셈블리어 기초 , 범용 레지스터 (0) | 2015.06.08 |
리버싱 :: 디버거를 실행해보자! (0) | 2015.06.06 |
리버싱 :: 리버싱(Reversing)이란? (0) | 2015.06.06 |
WRITTEN BY