본문 바로가기

Reverse Engineering

12. 함수 호출 리턴값 확인

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 레지스터를 사용해 전달한다.