본문 바로가기

dis & asm

함수 분석 (1)


함수가 어떤 방법으로 실행이 되는지 확인해봅니다
일단 코드

void func() {  }
int main()
{
    func();
    return 0;
}

디스어셈 하면....

08048344 <func>:
void func()
{ }
 8048344:   55                      push   %ebp
 8048345:   89 e5                   mov    %esp,%ebp
 8048347:   5d                      pop    %ebp
 8048348:   c3                      ret

08048349 <main>:

int main()
{
 8048349:   8d 4c 24 04             lea    0x4(%esp),%ecx
 804834d:   83 e4 f0                and    $0xfffffff0,%esp
 8048350:   ff 71 fc                pushl  -0x4(%ecx)
 8048353:   55                      push   %ebp
 8048354:   89 e5                   mov    %esp,%ebp
 8048356:   51                      push   %ecx
    func();
 8048357:   e8 e8 ff ff ff          call   8048344 <func>

    return 0;
 804835c:   b8 00 00 00 00          mov    $0x0,%eax
}


call 부터 보겠습니다.

함수라고 해서 특별히 해주는 건 없습니다 
단순히 함수에 있는 코드로 점프합니다.

우리가 보통 시작지점을 main에서 보면
main도 하나의 함수라고 볼수 있습니다

func함수가 끝나면 main으로 다시 돌아와야 합니다
그럴려면 점프하기 전에 func함수 다음의 코드주소를 스택에 저장합니다

바로 -> 804835c:   b8 00 00 00 00          mov    $0x0,%eax

스택에 804835c를 저장합니다 그래야 func가 끝나면 여기로 다시 점프를 하면 되죠
call 부르기 전

(gdb) x $esp
0xbf8274f4:    0xbf827510

call을 부른후

(gdb) x $esp
0xbf8274f0:    0x0804835c

스택에 들어간게 보이죠
func에서 하는 일은 없습니다
밑에 코드는 main에서 시작하는 코드와 유사합니다
바로 스택을 초기화하는 건데
이건 함수에서 변수를 추가해서 보는게 더 좋겠네요

 8048344:   55                      push   %ebp
 8048345:   89 e5                   mov    %esp,%ebp
 8048347:   5d                      pop    %ebp
 8048348:   c3                      ret

바로 다음장에서 인자를 넘겨 테스트 해보겠습니다.