whois

함수 호출 본문

Hacking/Reverse Engineering

함수 호출

HongJun Choi 2018. 1. 4. 16:38

본 글은 아래의 세 가지 내용을 중점적으로 다룬다.


· 세 개의 인자를 넘기는 함수 호출 코드

· 어셈블리

· 스택


[그림 1] 세 개의 인자를 넘기는 함수 호출 코드


그림 1과 같은 코드를 들고 온 이유는 함수 호출을 하면서 인자를 넘길 때 스택에 들어가는 인자들의 순서를 알아보기 위해서다.

C언어를 함수까지 배우신 분들이라면 충분히 이해할 수 있을거라고 본다.

간단하게 설명하자면, main 함수에서 go라는 함수 호출을 하면서 세 개의 인자를 넘겨주고 있다.


[그림 2] 어셈블리


go 함수와 main 함수 외의 어셈블리 코드들은 다 제거하였으니 참고바란다. go 함수를 호출 할 때 스택의 main 함수 해당하는 공간에 39h, 38h, 37h 순으로 푸시하고 있다. 이는 LIFO(Last In First Out) 구조 때문에 뒤에 있는 인자부터 들어가는 것이다. 그 후 go 함수를 호출하게 된다.


[그림 3] 스택


그림 2의 코드를 스택으로 그려보았다. 함수 프롤로그로 RET, EBP가 기본적으로 들어가게 되고 EBX, ESI, EDI 레지스터가 푸시로 스택에 쌓인인다. 그 후 go 함수로 전달되는 인자인 39H, 39H, 37H가 차례대로 들어가게 된다. 여기까지가 main 함수 부분이고 main 위에 go 함수가 쌓이게 된다. 참고로, 아래가 높은 주소이다. go 함수의 RET는 main 함수로 돌아가기 위한 주소이므로, 그림 2의 main 함수의 go 함수 호출 부분 다음인 01321729라는 값을 가진다.

'Hacking > Reverse Engineering' 카테고리의 다른 글

스택(Stack)  (0) 2018.01.04
필수 어셈블리 명령어  (0) 2018.01.04
레지스터  (0) 2018.01.03
어셈블리  (0) 2018.01.03
리버스 엔지니어링 개요  (0) 2017.12.27
Comments