본문 바로가기
반응형

Study78

[리버싱] 인터럽트에 대해 알아보자 인터럽트(Interrupt)란? 컴퓨터가 작업을 수행하던 도중 예기치 못한 특수한 상황이 발생하여 작업을 중단하고, 그 특수한 상황을 먼저 처리한 후, 원래의 작업으로 되돌아가 나머지 작업을 계속 수행하게 되는 일련의 과정 외부 인터럽트, 내부 인터럽트, 소프트웨어 인터럽트로 분류하는데, 외부나 내부 인터럽트는 CPU의 하드웨어에서의 신호에 의해 발생하고 소프트웨어 인터럽트는 명령어의 수행에 의해 발생함. 인터럽트 종류 외부 인터럽트(External Inteerupt) 1. 전원 이상 인터럽트 2. 기계 착오 인터럽트 3. 외부 신호 인터럽트 4. 입, 출력 인터럽트 내부 인터럽트(Internal Interrupt) 1. 잘못된 명령이나 데이터를 사용할 때 발생하며, 트랩(Trap)이라고도 부른다. 2... 2017. 9. 3.
[리버싱] 함수: 프롤로그&에필로그와 호출 규약 함수 호출 과정에 대해 알아보자. 1. 함수가 사용할 파라미터를 스택에 넣고 함수 시작지점으로 점프(함수 호출) 한다. 2. 함수 내에서 사용할 스택프레임을 설정한다. (프롤로그) 3. 함수의 내용을 수행한다. 4. 수행을 마치고 처음 호출한 지점으로 돌아가기 위해 스택을 복원한다. (에필로그) 함수의 프롤로그와 에필로그는 함수호출 규약에 따라 조금씩 다르다. 함수 호출 규약이란? 호출자(Caller)와 피호출자(Callee) 간에 '함수를 호출할 때 전달되는 인자의 순서나 사용이 끝나고 나서의 스택 정리 등'에 대한 약속이라고 할 수 있다. 크게 _cdecl, _stdcall, _fastcall이 있다. cdecl 주로 C언어에서 사용되며 함수를 호출한 함수(Caller)에서 스택이 정리된다. 가변 길.. 2017. 9. 1.
[리버싱] 스택프레임에 대해 알아보자 스택 프레임이란? 어떤 함수가 호출되었을 때 그 함수가 가지는 공간 구조 이러한 코드가 실행 되었을때 main()이라는 함수가 호출 되고 그 다음에 printf()라는 함수가 호출 된다. main() pushprintf() push printf() popmain() pop프로그램 종료 스택프레임은 LIFO 구조로 이해하면 된다. 2017. 8. 24.
[리버싱] 메모리 구조 코드(code) 영역 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(text)영역이라고도 부른다. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다. 데이터(data) 영역 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장된다. 데이터 영역은 쓰임새에 따라 3가지 영역으로 나뉜다. - 읽기 전용으로 초기화되는 영역 (.rodata) --> 상수키워드(const)로 선언되는 영역, 시스템에 사용된 각종 문자열 예를들어, printf()의 포맷스트링이나 상수 문자열 - 읽기/쓰기가 가능한 영역으로 초기화되는 영역 (.data) --> 전역변수 중 초기값을 갖는 경우 - 초기화되지 않은 영역 (.bss) --> 전역변수로 초기화 되.. 2017. 8. 24.
[리버싱] AND, TEST, CMP, SUB 차이 AND 비트연산을 수행한다. Operand의 값들을 2진수로 바꾸어 비트연산을 통해 값이 참의 값만을 가지고 온다. SUB 마이너스 기능을 수행한다. SUB a1, a2 형식이면 a1의 값을 a2만큼 감소한 후 결과값을 a1에 저장. TEST 첫번째 Operand와 두번째 Operand를 AND 시킨다. 이 연산의 결과는 ZF에만 영향을 미치고 Operand에 영향을 미치지 않고 버려진다. 두 Operand가 모두 0인지 아닌지 판단 가능. CMP 첫번째 Operand와 두번째 Operand를 뺀다. 이 연산의 결과는 ZF에만 영향을 미치고 Operand에 영향을 미치지 않고 버려진다. 두 Operand가 같은지 판단 가능. 2017. 8. 24.
[리버싱] MOV, LEA 두 명령을 비교해보자!! (1) mov eax, dword ptr SS:[ebp-4] ebp레지스터에서 4를 뺀 값을 주소로 하는 스택 세그먼트에서 4바이트 만큼 참조한 값을 eax에 넣는다. lea eax, dword ptr SS:[ebp-4] ebp레지스터에서 4를 뺀 값을 주소로 하는 스택 세그먼트에서 4바이트 만큼 참조한 값의 주소를 eax에 넣는다. (2) mov eax, dword ptr DS:[eax] eax레지스터를 주소로 하는 데이터 세그먼트에서 참조한 4바이트의 값을 eax에 넣는다. lea eax, dword ptr SS:[esp-40] esp레지스터에서 40을 뺀 값을 eax에 넣는다. 2017. 8. 24.
반응형