.386
.MODEL FLAT
PUBLIC _stst PUBLIC _ldst ; '_stst', '_ldst'함수 외부 접근 허용 코드
.code
_start:
_stst PROC NEAR32 ;store status
; - entry code - push ebp mov ebp, esp
pushfd mov esp, [ebp+8] ;esp obj로 이동 add esp, 40 ;esp obj 가장 아래로 이동
pushad ;eip와 efl을 제외한 모든 레지스터 구조체에 삽입 push [ebp+4] ; eip삽입 push [ebp-4] ; eflags삽입 add esp, 20 ; 구조체의 esp자리로 내려온다.
mov eax, ebp ; main의 esp를 구조체의 넣기 위해 레지스터 eax를 사용한다. add eax, 8 ; eax를 main의 esp가 있는 자리로 옮겨준다. ;12가 아닌 8인 이유는 esp는 마지막 변수를 가리키고 있기 때문이다. mov [esp], eax ; 구조체 esp에 main의 esp를 넣어준다. push [ebp] ; 구조체 ebp자리에 main의 ebp를 넣어준다.
;mov eax, [esp+20] eax에는 return값이 들어감으로 복구시킬 필요가 없다.
; - exit code - mov esp, ebp pop ebp ret ;pop eip ;메인 함수에서의 복구 ;add esp, 4 ;함수의 인자 자리를(&obj) 복구 시키기 위해 esp 사용한 인자의 크기만큼 옮긴다.
_stst ENDP
_ldst PROC NEAR32 ; ;mov esp, [esp+4] ;esp를 구조체로 이동 ;popfd ;구조체 efl값을 레지스터 efl로 이동 ;pop eax ;eax값에 구조체 eip값을 이동 ;mov ebx, esp ;현재 esp값(구조체에 edi를 가리킨다)을 백업 ;mov esp, [esp+12] ;구조체 esp값을 esp에 저장한다. ;push eax ;구조체eip값을 구조체 esp에 저장 ;mov esp, ebx ;esp를 구조체에 edi를 가리키는 값으로 이동시킨다. ;popad ;스택에 있는 내용을 레지스터에 채운다. ;mov esp, [esp-20] ;esp를 구조체 esp가 가리키는 곳으로 이동시킨다. ;sub esp, 4 ;esp - 4
mov esp, [esp+4] popfd pop eax mov ebx, [esp+12] mov [ebx-4], eax popad mov esp, [esp-20] sub esp, 4
ret ;pop eip
_ldst ENDP
|
마지막 연산을 통해서 efl값이 변동된다. efl값이 변동하지 않도록 다시 코딩을 해보자.