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

130925수 어셈블리 숙제 조유진

by 알 수 없는 사용자 2013. 9. 25.
728x90
반응형

소스코드

.386

.MODEL FLAT


PUBLIC _STST ; Store Status

PUBLIC _LDST ; Load Status

PUBLIC _MD ; Memory Display

PUBLIC _MM ; Memory Modify


.CODE

_STST PROC NEAR32

PUSH EBP

MOV EBP, ESP


PUSHFD


AND DWORD PTR [EBP-4], 0FFFFFEFFh


MOV ESP, [EBP+8]


ADD ESP, 40


PUSHAD


ADD ESP, 16

;Old EBP, RA, 인자, Main과의 경계

MOV EAX, EBP

ADD EAX, 8


PUSH EAX ; 메인 ESP


PUSH [EBP] ; Old EBP


SUB ESP, 8


PUSH [EBP+4] ; EIP(Return Address)

PUSH [EBP-4] ; EFL


MOV ESP, EBP

POP EBP

RET

_STST ENDP


_LDST PROC NEAR32


MOV ESP, [ESP+4] ; ESP = &Context


POPFD ; EFL = Context.EFL

; 플래그 레지스터에 값을 넣음


POP EAX ; EAX = Context.EIP

; 예전 EIP를 EAX 저장


MOV EBX, ESP ; EBX = Current ESP

; 현재 ESP 백업


MOV ESP, [ESP+12] ; ESP = Old ESP

; 과거 ESP로 점프


PUSH EAX ; Save Old EIP

; 과거 ESP에 EAX를 푸쉬하여 RA덮어씀


MOV ESP, EBX ; ESP = Current ESP

; 백업해둔 ESP를 다시 복원


POPAD ; ESP를 제외한 모든 값을 복원


MOV ESP, [ESP-20] ; Old ESP값을 복원

SUB ESP, 4 ; ESP를 RA위로 올려주어야 한다(RET이 POP하기때문)


RET

_LDST ENDP


_MD PROC NEAR32

PUSH EBP

MOV EBP, ESP


MOV EAX, [EBP+8]

MOV EAX, [EAX]


MOV ESP, EBP

POP EBP

RET

_MD ENDP


_MM PROC NEAR32

PUSH EBP

MOV EBP, ESP


PUSH EBX


MOV EAX, [EBP+8] ; EAX = Address

MOV BL, [EBP+12] ; BL = Data


MOV BYTE PTR [EAX], BL ; *EAX = BL


POP EBX


MOV ESP, EBP

POP EBP

RET

_MM ENDP


END

#include <stdio.h>


typedef struct _context

{

int efl;

int eip;

int edi;

int esi;

int ebp;

int esp;

int ebx;

int edx;

int ecx;

int eax;

} CONTEXT;


void STST( CONTEXT *stpReg ); // CPU의 정보를 메모리에 저장

void LDST( CONTEXT *stpReg ); // 메모리에 저장된 CPU 정보를 재등록


unsigned char MD( int * ); // Memory Display Function By Assembly

void MM( int *, char); // Memory Modify Function By Assembly


void PrintRegister( CONTEXT *stpReg );


int main()

{

int a = 0x12345678;


CONTEXT stReg = { 0, };


printf( "0x%08X : %02X\n", &a, MD( &a ) );

MM( &a, 0xFF );


printf( "0x%08X : %02X\n", &a, MD( &a ) );

printf( "0x%08X : %08X\n", &a, a );


PrintRegister( &stReg );


STST( &stReg );

PrintRegister( &stReg );


getchar();


LDST( &stReg );


printf( "Kernel Panic\n" );

return 0;

}


void PrintRegister( CONTEXT *stpReg )

{

printf( "┌──────RegisterStatus──────┐\n" );

printf( "│EAX : 0x%08X\t", stpReg->eax );

printf( "ECX : 0x%08X│\n", stpReg->ecx );

printf( "│EDX : 0x%08X\t", stpReg->edx );

printf( "EBX : 0x%08X│\n", stpReg->ebx );

printf( "│ESP : 0x%08X\t", stpReg->esp );

printf( "EBP : 0x%08X│\n", stpReg->ebp );

printf( "│ESI : 0x%08X\t", stpReg->esi );

printf( "EDI : 0x%08X│\n", stpReg->edi );

printf( "│EIP : 0x%08X\t", stpReg->eip );

printf( "EFL : 0x%08X│\n", stpReg->efl );

printf( "└───────────────────┘\n\n" );

}



결과 사진


위는 원래 값, 중간은 0xFF로 수정한 값, 아래는 전체 값입니다. 1바이트만 수정되었다는 것을 알 수 있습니다.

728x90