15_어셈블리(함수)
- 분석 환경 : WindowsXP(32bit)
- 분석 도구 : OllyDbg, VS2008
1. 함수
- 특정 기능을 수행할 수 있도록 코드들이 모여있는 일종의 작은 프로그램 단위를 의미한다.
- 함수 처리 과정 : 함수 호출 -> 함수 시작(프롤로그) -> 함수 본체 -> 함수 종료(에필로그)
- 함수가 호출되기 이전에 인자값들이 스택에 PUSH가 되고, 리턴주소를 저장한 다음에 함수가 시작된다.
- 함수 처리가 완료되면 결과값(리턴값)을 EAX 레지스터에 저장하여 리턴하고 함수를 종료한다.
- 함수 구문은 다음과 같다.
반환값 함수명(인자, 인자...)
{
코드들....
}
2. 함수 이해
1) VS 2008을 이용하여 'func.exe' 파일을 제작한다.
- 파일 -> 새로 만들기 -> 프로젝트 -> 빈 프로젝트 -> 위치(04_테스트) & 이름(func) -> 확인
- '소스 파일' 우클릭 -> 추가 -> 새 항목 -> 'C++ 파일(.cpp)' 선택 -> 이름(func) -> 추가
#include <stdio.h>
int func(int num1, int num2)
{
return num1+num2;
}
int main()
{
func(6, 2);
return 0;
}
- 파일 -> 모두 저장 -> 닫기
2) 'cl' 명령어를 이용한 최적화 컴파일 실시


3. 올리디버거를 이용한 'func.exe' 분석
- 메모리 주소, 레지스터 저장 값, 스택 내용, 메모리 덤프 내용 확인
1) Main함수 찾기(F8)

2) Main함수 진입(F7) – 함수 프롤로그, 함수본체, 함수 에필로그 확인

다음은 func함수에 전달할 인수 2와 6을 PUSH하는 모습이다.


3) func 함수 진입(F7)

func 함수는 다음과 같이 [EBP+8]안의 6을 EAX에 저장한 후, 이를 [EBP+C]와 더하여 다시 EAX에 저장하는 과정을 수행하고, 이는 func 함수 안의 num1+num2; 코드에 해당된다. 리턴값을 EAX에 저장한 후, func함수는 POP EBP 이후 소멸된다.



그 후, 다시 Main함수로 리턴하고 다음과 같이 인수 할당에 쓰였던 스택을 ADD를 통해 4byte*2만큼 없애준다.
EAX을 0으로 초기화하고 POP EBP를 통해 Main 함수 또한 종료하게 된다 (함수 에필로그).

'정보보안 > 리버싱' 카테고리의 다른 글
| reverse_assembly 기본명령어 JE&JZ (0) | 2022.09.02 |
|---|---|
| reverse_assembly 기본명령어 IDIV (0) | 2022.09.02 |
| reverse_assembly 기본명령어 MOV (0) | 2022.09.02 |
| reverse_assembly 지역변수&전역변수 (2) | 2022.09.02 |
| reverse _assembly 스택프레임 **다시 공부하고 쓰기 (1) | 2022.09.02 |