9. 콜린 컨벤션 __cdecl 함수 어셈블리어 코드
본 포스팅의 내용은 해킹 맛보기 책의 내용중 3장 리버스 엔지니어링 P133~P281 까지 실습 내용을 따라하기 해보았습니다. 책의 내용중 일부 발췌 (수정) 하였습니다. 문제가 될 때는 비공개 하도록 하겠습니다. |
[발췌]
구분 |
__cdecl |
__stdcall |
__fastcall |
인자 전달 방법 |
스택 |
스택 |
레지스터, 스택 |
스택 해제 방법 |
호출한 함수 |
호출된 함수 |
호출된 함수 |
#include <stdio.h>
int __cdecl sum(int a, int b, int c)
{
return a+b+c;
}
int main()
{
int s;
s = sum(1, 2, 3);
printf("%d ", s);
return 0;
}
[발췌-수정]
PUSH 명령어를 이용해 스택에 인자를 차례대로 쌓아가는 것을 확인할 수 있다. 윈도우 운영체제에서 스택은 높은 주소에서 낮은 주소로
데이터를 쌓아간다. 따라서 01271432 주소의 PUSH 1 명령어까지 실행하면 스택 구조는 그림 3-30과 같고 ESP는 마지막으로
스택에 넣은 변수 1이 저장된 스택 주소를 가리킨다.
__cdecl 호출 규약은 아래 그림과 같이 스택을 이용해서 인자를 입력하는 것을 확인할 수 있다.
Low Address |
|
|
|
|
1 |
|
|
|
2 |
|
|
|
3 |
<- |
ESP |
High Address |
|
|
|
--cdecl 인자 전달 스택 구조
Low Address |
|
|
|
|
1 |
|
|
|
2 |
|
|
|
3 |
|
|
|
|
<- |
ESP |
High Address |
|
|
|
--cdecl 스택 해제
'Reverse Engineering' 카테고리의 다른 글
11. 콜린 컨벤션 __fastcall 함수의 어셈블리어 코드 (0) | 2016.11.10 |
---|---|
10. 콜린 컨베션 __stdcall 함수의 어셈블리어 코드 (0) | 2016.11.10 |
8. while문이 포함된 어셈블리어 코드 (0) | 2016.11.10 |
7. for 리버싱 for문이 포함된 어셈블리어 코드 (0) | 2016.11.10 |
6. 6개의 분기가 포함된 어셈블리어 코드 (0) | 2016.11.10 |