9월 24일 ATmega 시리얼 통신 & 어셈블리 정리
추가된 함수와 변수 |
typedef struct _cmdmap { 해당하는 함수를 호출 해주는 역할을 하는 함수 */ |
무한루프를 출력하는 어셈블리 소스 |
.386
.MODEL FLAT
PUBLIC _STST
PUBLIC _LDST
.CODE
_STST PROC NEAR32
PUSH EBP
MOV EBP, ESP
PUSHFD ; EFL 임시저장
MOV EAX, [EBP-4] ; EFL이 변형되기 때문에
AND EAX, 0FFFFFEFFH ; TF(Trap Flag) 제거
MOV [EBP-4], EAX
MOV ESP, [EBP+8] ; ESP를 _EAX 위치로 이동
ADD ESP, 40
PUSHAD ; 레지스터 값들 push
PUSH [EBP+4] ; push EIP(return address)
PUSH [EBP-4] ; push EFL
ADD ESP, 24 ; _ESP 위치로 가서
MOV EAX, EBP
ADD EAX, 8 ; EBP로 부터 ESP를 찾아서
PUSH EAX ; old ESP-4 push
PUSH [EBP] ; old EBP push
MOV ESP, EBP ; Exit code
POP EBP
RET
_STST ENDP
; 메모리 정보를 cpu 레지스터로 이동
_LDST PROC NEAR32
MOV ESP, [ESP+4] ; ESP = &CONTEXT
POPFD ; EFL CPU로 : EFL = CONTEXT.EFL
POP EAX ; EIP BACK UP : OLD EIP
MOV EBX, ESP ; TEMP = CURRENT ESP
MOV ESP, [ESP+12] ; ESP = OLD ESP
PUSH EAX ; RETURN ADDR 조작(EIP) : SAVE OLD EIP
MOV ESP, EBX ; ESP = CURRENT ESP
POP EDI
POP ESI
POP EBP
ADD ESP, 4 ; skip ESP
POP EBX
POP EDX
POP ECX
POP EAX
MOV ESP, [ESP-20] ; RETURN ADDR 지정
SUB ESP, 4
RET
_LDST ENDP
|
위의 어셈블리 함수를 호출하여 사용하는 c언어 소스 |
|
#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 print_reg(CONTEXT *stpReg); void STST(CONTEXT *); void LDST(CONTEXT *); int main(void) { CONTEXT stReg = {0,}; printf("************************ Before ***************************\n"); print_reg(&stReg); STST(&stReg);
printf("************************ After ****************************\n"); print_reg(&stReg); getchar(); LDST(&stReg); printf("Kernel Panic\n");
return 0; } void print_reg(CONTEXT *stpReg) { printf("EAX VALUE : 0x%08X\tECX VALUE : 0x%08X\n", stpReg->eax, stpReg->ecx); printf("EDX VALUE : 0x%08X\tEBX VALUE : 0x%08X\n", stpReg->edx, stpReg->ebx); printf("ESP ADDR VALUE : 0x%08X\tEBP ADDR VALUE : 0x%08X\n", stpReg->esp, stpReg->ebp); printf("ESI ADDR VALUE : 0x%08X\tEDI ADDR VALUE : 0x%08X\n", stpReg->esi, stpReg->edi); printf("EIP ADDR VALUE : 0x%08X\tEFL ADDR VALUE : 0x%08X\n\n", stpReg->eip, stpReg->efl); } |