전체 글 289

바이트 오더링 (Byte Ordering)

메모리를 저장하는 방식인 바이트 오더링에 대해 알아보자. 리틀 엔디언과 빅 엔디언 방식을 얘기하는 것이다. Big Endian (빅엔디언) 시작주소에 상위 바이트부터 기록하는 것. 사람이 보는 방식과 동일한 순서로 저장된다. 12 34 56 78 이렇게 들어온다면 12 34 56 78 이대로 저장하는 방식. 대형 유닉스 서버에 사용되는 RISC 계열 CPU와 IBM370 컴퓨터, 네트워크 프로토콜에 사용된다. (참고로 응용프로그램에서 리틀엔디언을 써도 네트워크 통신 시에 엔디언 방식을 바꿔야 함.) Little Endian (리틀엔디언) 시작주소에 하위 바이트부터 기록하는 것. 인텔 x86 CPU에서 사용된다. 유닉스나 윈도우 시스템... 12 34 56 78 이렇게 들어오면다면 78 56 34 12 이..

함수 호출 규약 (Function Calling Convention)

함수 호출 규약, Function Calling Convention 에는 여러가지 종류가 있다. 각 호출 규약들은 파라미터 받는 순서, 인자 정리 하는 방법 등 여러가지 차이점들이 존재한다. 한번 알아보도록 하겠음. 1. __cdecl C, C++ 에서 default 값으로 사용되는 호출 규약이다. 기본 호출 규약. 함수 호출자(caller)가 인자를 정리한다. 인자 호출은 오른쪽에서 왼쪽 즉, 뒤에서 부터 앞으로 __cdecl 은 함수 인자의 갯수를 미리 알고 호출하기 때문에 가변 인자를 호출할 수 있다. 함수 정의 방식은 "_함수명" 인자 정리를 add를 이용하여 한다. 2. __stdcall Win32 API 함수들이 사용하는 호출 규약이다. __cdecl과 다르게 함수 피호출자(callee)가 인..

메모리 스택(Stack)영역

스택에 대해 알아보자. 알고 있을진 모르겠지만 스택의 역할은 뭐.. 로컬 변수 임시 저장, 함수 호출 시 파라미터 전달, 리턴 어드레스 저장 등이 있다. 구조는 후입선출이다. Last In First Out 가장 마지막에 넣은 녀석부터 다시 튀어나온다는 것. (POP연산을 한다고해서 튀어나온다고 표현을 했는데 실제로는 그 값은 살아 있지만 후에 나올 esp가 pop연산을 만나면 자동으로 4바이트 아래로 내리기 때문에 튀어나오는 것 처럼 보이는거.) 스택은 메모리에 높은 주소 쌓이는 이유는 힙과 마주보며 쌓이면서 메모리를 좀더 효율적으로 사용할 수 있도록 하기 위해서 이렇게 설계되었다고 하는데 구체적인 이유가 2가지 정도 있다. 1. 높은 주소부터 거꾸로 스택을 채워나가면 스택영역이 커널영역에 침범할 일이..

x86 메모리 구조

우리는 인텔 32비트 시스템 즉, 8086 시스템에 대해 알아본다. x86 메모리 구조 (8086 Memory Architecture) 는 아래와 같이 생겼다. 위에서 부터 설명하겠음. * 커널 영역 : OS의 시스템 코드가 로드되는 부분이다. 우리가 직접 건드릴 수 없는 영역이다. * Off-Limit 영역 : 사용자가 커널 영역에 접근하지 못하도록 할당 해둔 공간이다. * 유저 영역 : 유저가 실제 사용하는 영역이다. 스텍, 힙, 코드 영역이 여기에 포함된다. * Null Pointer 할당 영역 : 모두 0이고 변경 불가능한 영역, 시스템 보호 차원에서 만들어둔 영역 위 메모리 구조는 윈도우 기준이고, 리눅스는 커널영역이 1GB 이다. 32비트 기준으로.. 시스템에 실행되는 모든 프로세스들은 4GB..

리버싱(Reversing) 그리고 올리디버거(Ollydbg)

Reverse Engineering (역공학) 말그대로 프로그램을 뒤집어 까는 것이다. 리버싱 하는 방법에는 2가지가 있다. 먼저 정적 분석 파일을 실행하지 않고 있는 그대로의 모습으로 분석하는 것이다. 파일 종류, 크기, 헤더, API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등의 다양한 내용을 확인하는 것이다. 디스어셈블러를 이용해 내부 코드와 구조를 확인하는 것도 여기에 속한다. 다음 동적 분석 파일을 직접 실행 시켜서 분석하는 것이다. 디버깅을 통하여 흐름과 메모리 상태 등을 살펴보는 방법. 파일, 레지스트리, 네트워크 등을 관찰하고 디버거를 이용하여 프로그램 내부 구조를 분석하는 것이다. 이 두가지 방법을 적절히 혼용하여 사용하면 된다. 이 외에 기초적인 단어들..

반응형