본문 바로가기
코스웨어/14년 스마트컨트롤러

2014.08.04 업무일지 [김대희]

by 알 수 없는 사용자 2014. 8. 4.
728x90
반응형

프로시저는 어셈블리에서 '함수'

어셈블리에서 '프로시저'라고 해서 다른 고수준 언어에서 '함수'라고 부르는 것이아니고

C언어에서도 이를 프로시저라고 부름



Initialize는 함수의 이름이고

ENDP는 함수가 끝났다는 뜻이다.


이 함수는 만들어는 져있지만 호출은 되지 않는다.

왜냐하면 Entry Point가 _start로 되어있기 때문이다.

이는 C언어와 유사함


함수를 호출하는 방법은 

call initialize


_start도 실제로는 initialize나 마찬가지다

ENDP가 INVOKE exitprocess 일 뿐


예제로 살펴보자 



.386

.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD


.STACK 4096      ;reserve 4096-byte stack


.DATA ;각 변수에 아래와같은 값을 넣음

Count1   DWORD   11111111h 

Count2   DWORD   22222222h 

Total1   DWORD   33333333h

Total2   DWORD   44444444h  


.CODE

; initialize는 함수이름이며

; PROC NEAR32는 일반적인 범위설정이다.

; ENDP는 함수가 끝났다는 뜻

Initialize         PROC  NEAR32

mov   Count1,0   ; zero first count

mov   Count2,0   ; zero second count

mov   Total1,0   ; zero first total

mov   Total2,0   ; zero second total

mov   ebx,0      ; zero balance

ret ; return


Initialize ENDP


_start: ; 함수호출이 여러번 가능하다는 것을

; 보여주기 위해 두 번 호출 해봄

call   Initialize

call   Initialize        


INVOKE ExitProcess, 0    


PUBLIC _start

END                  ; end of source code


.DATA부분을 보면 각 변수와 레지스터에 값을 무작위로 처넣음

그리고 initialize(함수)에서 모두 '0'의 값을 넣는 기능을 하는 함수를 만듬

그리고 _start에서 initialize 호출....끝


그냥 c언어 함수선언과 호출이랑 문법만 다르지 별반 다를거 없음




함수호출이란 함수가있는 주소로 점프한다는 뜻이나 마찬가지

call    initialize

위와같은 코드를 풀이하자면


mov    EIP, initialize

이거나 마찬가지다


하지만 EIP는 mov 또는 add로 절대 건드릴 수 없는 레지스터이며

함부로 건드려서는 안되는 레지스터

EIP(Extended Instruction Point)


소스코드를 보면 NEAR32 라고 했음

그러므로 위 표에서는 첫번째 'near relative'에 해당함

(near indirect는 near뒤에 주소를 쓰는 것)

opcode를 보면 'E8'이라고 되있음 

그리고 Number if Bytes는 '5'이다.

확인


Number if bytes가 5byte이므로

메모리주소 40107A에 있는 값에서 'e8 cd ff ff ff'를 봐야한다.

'e8'은 opcode니까 일단 빼고

cd ff ff ff 가 지금 메모리에 little-endian으로 들어가 있으므로

실제값은 'ff ff ff cd'이다. 음수로 '-51'이라는 것을 확인할 수 있음


지금은 EIP가 40107A를 가리키고 있지만

이 코드 다음에 있다는 것을 염두해야 한다.



다시말해 0x0040107A는 현재 '_start'의 위치이다.

opcode를 잘 보자. 'e8'은 near relative의 opcode이므로

'cd ff ff ff'즉 '-51'의 범위 안에 initialize가 있다는 뜻이 된다.


EIP가 40107F에 있다는 것을 염두하고 (10진수))-51을 해보면

'40104C'가 나온다.

이게 무슨 주소인가?

바로 initialize의 주소



다시말해 _start의 주소의 끝인 40107F에서 FFFFCD 만큼 뒤로가면 

initialize의 주소인 40104C가 나온다.


내가 이해안되니까 다시 그림으로 설명함


위에서 'e8 cd ff ff ff'는 ff ff ff cd 즉, -51만큼 EIP를 이동하라(e8)라는 뜻이 된다.

pointer는 그 구문을 실행 한뒤 를 기점이므로 40107F에서 -51떨어진 40104C(initialize)

로 이동하라는 말이 됨.








PUBLIC은 다른 파일에 함수를 공유하고 싶을때 사용 함

C언어에서 어셈블리를 호출할 때 어셈블리에서 PUBLIC을 걸어줘야

C에서 호출이 가능하다



EXTRN은 어셈블리 소스에서 다른쪽에 있는 함수를 불러오는 명령어

어셈블리가 다른 언어에서 함수를 불러올때 쓰임

어셈블리에서 어셈블리를 호출할 일은 별로 없으므로 잘 사용하지 않는다.





C에서 함수를 호출할때 인자는 오른쪽에서 왼쪽으로 순서대로 Stack에 할당됨



void swap(int A, int B)

{

int C

}

이라면 B부터 Stack에 할당됨..

그냥 외우셈



  • EBP(extended base point)

함수 A가 있다고 가정함 이 함수는 '인자'가 있음

함수 A가 실행되면 Stack어딘가에 A의 인자 즉, 변수가 할당될 것임

Stack에 할당된 이 변수에는 시작과 끝이 있는데 시작점을 EBP라고 하며 끝을 ESP라고 함.


함수A에서 또다시 인자가 있는 함수 B를 호출했다고 가정

그러면 함수 A는 끝난것이 아니라 아직 '실행중'에 있음


이때 A에서 호출된 함수B의 인자는 새로운 Stack을 할당함

그리고 함수A의 인자(변수)의 ESP가 B의변수의 EBP가 됨

그림으로 표현하면 다음과 같음





  • Entry code, Exit code



Exit code는 정확히 다음과 같음

mov esp, ebp

pop dbp








  • C에서 어셈블리를 호출하는 방법을 다룸

C code(main.c)

#include <stdio.h>


int smart();


int main()

{

int A;

A = smart();


printf("%d\n",A);


return 0;

}


asm code(smart.asm)

.386

.MODEL FLAT

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD


PUBLIC _smart


.CODE

_smart PROC   NEAR32

push ebp ;entry code

mov ebp, esp ;entry code


mov eax, 400


mov esp, ebp ;exit code

pop ebp ;exit code

ret ;exit code


_smart ENDP


END


어셈블리코드를 보면 eax에 '400'을 넣고있음

return값은 EAX레지스터에 들어간다.

즉 400을 리턴하는 함수 _smart를 만들었다는 얘기가 됨


이 400이라는 리턴값을 C코드에서 출력해 보겠음


먼저 asm파일을 컴파일해서 obj파일을 생성해야 함

ml /c /coff smart.asm


그리고 main.c를 컴파일 할때 다음과 같이 컴파일 해야 함

cl main.c smart.obj

그러면 컴파일이 됨


그리고 실행파일을 실행하면






이제 다른경우를 살펴보자

C code(main.c)

#include <stdio.h>

int smart(intintint);

int main()
{
  int A;
  A = smart(1,2,3);

  printf("%d\n",A);  

  return 0;
}


smart 함수에는 3개의 인자가 있다

stack은 위와같은 그림이 될것임




  • feat. 오두환




필기개판임

모자란 부분 나중에 보충예정


<수정중>

728x90