12. 함수 호출 리턴값 확인
본 포스팅의 내용은 해킹 맛보기 책의 내용중 3장 리버스 엔지니어링 P133~P281 까지 실습 내용을 따라하기 해보았습니다. 책의 내용중 일부 발췌 (수정) 하였습니다. 문제가 될 때는 비공개 하도록 하겠습니다. |
#include <stdio.h>
int sum(int a,int b, int c)
{
return a+b+c;
}
int main()
{
int s;
s = sum(1, 2, 3);
printf("%dn", s);
return 0;
}
3개의 인자를 입력 받아 모두 더한 결과값을 리턴하는 main 함수의 어셈블리어
[발췌-수정]
위의 어셈블리어는 main() 함수의 일부분이다. 013C1434 CALL 013C1104 명령어로 sum() 함수 호출 이후
013C1441 주소에서 EAX 레지스터에 저장된 함수 리턴값을 [EBP-8] 주소의 스택에 저장한다.
013C144A 주소에서 printf() 함수를 호출하기 위해 013C1441 주소에서 [EBP-8] 주소의 스택에 저장된
sum() 함수의 리턴값을 다시 EAX 레지스터에 저장하고, 013C1444 주소에서 printf() 함수의 두 번째 인자로 입력한다.
C언어 소스를 보면 printf() 함수의 두 번째 인자로 sum() 함수의 리턴값을 입력하는 것을 확인할 수 있다.
모든 함수의 리턴값을 EAX 레지스터를 사용해 전달한다.
'Reverse Engineering' 카테고리의 다른 글
14. 지역변수, 전역변수, 포인터 (0) | 2016.11.14 |
---|---|
13. 함수 프롤로그,에필로그 (0) | 2016.11.14 |
11. 콜린 컨벤션 __fastcall 함수의 어셈블리어 코드 (0) | 2016.11.10 |
10. 콜린 컨베션 __stdcall 함수의 어셈블리어 코드 (0) | 2016.11.10 |
9. 콜린 컨벤션 __cdecl 함수 어셈블리어 코드 (0) | 2016.11.10 |