본문으로 바로가기

20151101 - stst()

category 마이 스토리/내용 정리중인 글들.. 2015. 11. 1. 23:08
휴가 -2Day



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


구조체 .c영역

#include <stdio.h>


typedef struct _context

{

unsigned int EFL;

unsigned int EIP;

unsigned int EDI;

unsigned int ESI;

unsigned int EBP;

unsigned int ESP;

unsigned int EBX;

unsigned int EDX;

unsigned int ECX;

unsigned int EAX;

}context;



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


 .asm영역

.386

.MODEL FLAT

.STACK  4096 


PUBLIC _STST


.CODE 

_STST PROC NEAR32


(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)

push ebp              ; entry code

mov ebp,esp    ; entry code

pushfd                      ;  FLAG레지스터 저장




(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)

mov  esp, [ebp + 8] ; 구조체 주소를 esp로옮김

add  esp, 40 ; esp가 구조체 가장 아래 데이터에 저장할 준비


pushad ;레지스터 정보 저장




(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


mov eax,  ebp           ; 현재ebp를 eax로 옮긴다음


add  eax,  8           ; +8을 해주면 eax는 &status를 가리키는 주소를 가지게된다.


mov  [esp + 12], eax     ; status주소를 구조체내의 esp에 저장한다.



※현재 ESP는 EDI를 가리키고있다.

(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)



mov  eax, [ebp]        ;  레지스터에 있는 ebp의 값은 eax로 옮기고 


mov  [esp +  8], eax  ;  [ebp]에 있는 값을 ebp에 넣는다. 



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


mov  eax, [ebp + 4] ;  R.A값을 eax로 넣고


push  eax        ;  push해주면 구조체내의 eip로 들어간다.



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


push  [ebp - 4] ; 마지막으로 FLAG레지스터의 값은 EFL로 들어간다.



(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


mov esp,ebp ; exit code

pop ebp ; exit code

ret                 ; exit code


_STST ENDP

END


실행은 각자 해보는거져 >.<


(*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~)


CDECL vs STDCALL

함수를 리턴할 때 쓰는 방식

Left CDECL                                                                                                 RIGHT STDCALL

콜러가 스택을 정리하는 방식