본문 바로가기
반응형

코스웨어/13년 스마트컨트롤러419

2013년 9월 23일 어셈블리 PUSHAD 사용 2013. 9. 24.
0923 어셈블리 과제 _이수현 windbg를 이용하여 실제 레지스터 값과 메모리에 저장한 값 비교- 피호출함수 LINUX에서 호출함수 SMART의 변수값 변경- 변수는 전역변수이며 하나의 구조체로 생각한다- 레지스터 값을 알아본다- 변수의 순서는 레지스터의 저장 순서에 맞춘다 주의- 메모리값은 Little Endian- 메모리에 저장한 값의 순서에 맞춰서 비교- EFL 의 상태가 변화함 (초기 EFL값에 디버그 관련 상태비트 TF를 강제적으로 삭제하여 초기값 적용)- EAX 는 무시- ESP 의 마지막 +4 전 상태 - PUSHAD를 활용 2013. 9. 23.
13.09.23 어셈블리 과제 이도윤 SMART.ASM .386 .MODEL FLAT .STACK 4096 PUBLIC _SMART EXTRN _LINUX: NEAR32 ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD .DATA _EFL DWORD 0H _EIP DWORD 0H _EDI DWORD 0H _ESI DWORD 0H _EBP DWORD 0H _ESP DWORD 0H _EBX DWORD 0H _EDX DWORD 0H _ECX DWORD 0H _EAX DWORD 0H .CODE _SMART: LEA EBX,_EFL; EBX = &_EFL PUSH EBX CALL _LINUX MOV ESP,4; 인자 때문 INVOKE EXITPROCESS, 0 END LINUX.ASM .386 .MODEL F.. 2013. 9. 23.
기초 어셈블리 0923 -임기준 smart.asm ;DATA: 09/23 .386.MODEL FLAT .STACK 4096 PUBLIC _SMARTEXTRN _LINUX:NEAR32 ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD .DATA_EFLDWORD0h_EIPDWORD0h_EDIDWORD0h_ESIDWORD0h_EBPDWORD0h_ESPDWORD0h_EBXDWORD0h_EDXDWORD0h_ECXDWORD0h_EAXDWORD0h .CODE_SMART:LEAEAX, _EFL; EAX = &_EFLPUSHEAXMOVEAX, 0CALL_LINUXADDESP, 4; 인자가 하나라서 4INVOKE ExitProcess, 0 END Linux.asm ;DATA: 09/23 .386.MODEL FLA.. 2013. 9. 23.
9월 23일 어셈블리 수업 정리(컨텍스트 보존하기) - 석주원 LINUX 프로시져 호출 전 스택에 _EFL 변수의 시작 주소를 PUSH 해둔다._EFL변수의 주소를 스택에 저장해 둠으로써 C언어의 함수의 인수와 같이 사용할 수 있도록 한다.이렇게 함수를 호출하는 측에서(caller) 인수를 처리하는 방식을 cdecl 방식이라고 하고,그 반대로 호출받는 측에서 (callee) 인수를 처리하는 것을 stdcall 방식이라고 한다. LINUX 프로시져에서 주의할 점은 EFL의 값이 ADD연산을 거칠 때 변한다는 점과디버그 중일 때는 EFL의 8번째 비트 TF (Trap Flag)가 1로 변한다는 점이다.그러므로 다른 레지스터의 값을 스택에 보존해주기에 앞서서 EFL 레지스터의 값부터 추출해주고,8번째 비트인 TF의 값을 0으로 초기화 시키기 위해 AND 연산으로 마스킹해.. 2013. 9. 23.
20130923 어셈블리어 수업 (레지스터값들 변수에 넣기) context 프로그램 만들기 smart0923.asm .386 .MODEL FLAT .STACK 4096 PUBLIC _SMART EXTRN _LINUX:NEAR32 ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD .DATA _EFL DWORD 0h _EIP DWORD 0h _EDI DWORD 0h _ESI DWORD 0h _EBP DWORD 0h _ESP DWORD 0h _EBX DWORD 0h _EDX DWORD 0h _ECX DWORD 0h _EAX DWORD 0h .CODE _SMART: LEA EAX, _EFL ; EBX = &_EFL PUSH EAX MOV EAX, 0 CALL _LINUX ADD ESP, 4 INVOKE ExitProcess, 0 .. 2013. 9. 23.
0923 어셈블리수업내용_ 김성엽 ▶ SMART 함수가 LINUX 함수를 호출하고, 변수값 직접넣기 디버깅 수행 ▶ EFL 의 주소 확인 ▶ 특이한점은 Debug 시에 Trap Flag 로 인해서 : 346이 떠서 AND 를 이용해서 임의로 EFL 의 주소를 제대로 찍어줌 ▶ 나머지는 주석을 순서대로 확인! 2013. 9. 23.
130923 어셈블리 숙제 조유진 엔트리/엑시트 코드 생략 PUSHFD ANDDWORD PTR [EBP-4], 0FFFFFEFFhMOVESP, [EBP+8] ADDESP, 40 PUSHAD ADDESP, 16;Old EBP, RA, 인자, Main과의 경계MOVEAX, EBPADDEAX, 8 PUSHEAX; 메인 ESP PUSH[EBP]; Old EBP SUBESP, 8 PUSH[EBP+4]; EIP(Return Address)PUSH[EBP-4]; EFL 실행 결과 ............나름대로 노력하여 정리하였으나 너무 복잡하네요ㅋㅋㅋㅋㅋㅋㅋ주머니에서 갓 빼낸 이어폰인줄ㅋㅋㅋㅋㅋㅋㅋ 레지스터구조체메인EFL 246 212(처음에 246) EIP 401021 401021 EDI FFFFFFFF FFFFFFFF ESI 7C940222 7C.. 2013. 9. 23.
20130923 정리 AVR 수업 내용 정리 문자열 비교하는 함수 직접 만들기 AVR 인터럽트에 관하여... AVR 인터럽트 벡터는: 인터럽트 소스 하나하나에 인터럽트를 처리하기 위한 서브루틴의 기본 주소를 갖는다. 이 기본 주소가 특정 번지로 고정이 되어 있고, 이 주소들을 묶어서 인터럽트 벡터라고 한다 . 인터럽트 진행 순서는: 1. 주 프로그램 실행 -> 2. 인터럽트 발생 -> 3. 복귀주소 저장 -> 4. 인터럽트 벡터로 점프 -> 5. 인터럽트 처리 -> 6. 인터럽트 처리완료 -> 7. 복귀주소 로드 -> 8.마지막에 실행되던 주소로 점프 -> 9. 주 프로그램 실행 인터럽트 벡터를 쓰기 위해 만든 함수 위에서 설명 한듯이 인터럽트 벡터의 주소는 특정 번지로 고정되어 항상 일정 하다. 2013. 9. 23.
728x90
반응형