NT_HEADER -> SECTION_HEADERSection 이란?PE파일(프로그램) 에는 다양한 것들이 들어간다. main 및 각종 프로그램의 동작을 정의하는 함수들의 코드들, 전역 변수로 설정된 데이터나 프로그램 안에 들어가 있는 문자열 (예: 포맷 스트링), 그리고 프로그램 안에 이미지를 같이 포함시켜 리소스 형태로 저장할 수 도 있다. PE에서는 이런 코드와 데이터들을 한꺼번에 모아놓지 않고, 각각 그 특성과 필요에 맞추어 각각의 데이터들을 "섹션" 으로 나누어 따로 따로 저장하며,이러한 섹션에는 Read/Write/Execute 이 세가지의 권한 옵션이 주어진다. IMAGE_SECTION_HEADERtypedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAG..
PE에서의 VA(Virtual Address), RVA(Relative Virtual Address), RAW(File Offset)PE(Windows)말고, Linux에서도 마찬가지이지만, 각각의 응용 프로그램들은 실행되고 나면 서로 공유되지 않은 메모리 주소를 사용할 수 있다. 0x00000000 ~ 0xFFFFFFFFF 의 공간을 각자의 프로그램들이 자신의 것처럼 사용할 수 있게 된다.다시 말해, 모든 프로세스는 자신만의 가상 주소 공간을 가지고 있고,32비트 프로세스는 최대 4GB(메모리 포인터 - 4바이트) / 64비트 프로세스는 최대 16EB(메모리 포인터 - 8바이트)의 메모리 공간을 가질 수 있다.이러한 기술을 "가상 메모리 기법" 이라고 하는데, 이는 나중에 따로 설명하고, 여기서는 VA..
NT_HEADER -> IMAGE_OPTIONAL_HEADER (x86)이 헤더의 경우 컴파일된 시스템의 아키텍쳐에 따라 구조체의 내용과 크기가 조금씩 달라지므로,가장 범용적인 x86 (32비트) 의 헤더에 대해서만 살펴본다. 이 구조체 역시 "winnt.h" 파일에 정의되어 있다.!! RVA / VA : 다음 포스트에 설명. - 여기서는 해당 데이터 섹션에 대한 설명만 기록한다. typedef struct _IMAGE_OPTIONAL_HEADER { // Standard fields. - Microsoft comment WORD Magic; BYTE MajorLinkerVersion; // file version BYTE MinorLinkerVersion; // file version DWORD Siz..
C++ bit OR 연산 여러개의 설정값(True of False - Flag)를 저장하고 확인할 때, 유용하게 사용할 수 있는 방법이다. 구조체를 선언해 여러 개의 bool 변수를 만들어 주거나, 또는 단순히 여러 개의 FLAG이름을 붙인 bool 형식 변수를 만들어도 되지만, bit 연산을 통해 변수 하나에 여러 개의 flag(true or false) 설정값을 저장할 수 있다. 위 사진은 VC++ 의 기본 헤더 파일인 "winnt.h" 에 정의되어 있는 것 중 PE 포맷의 NT_FILE_HEADER (COFF)에 쓰이는 Characteristics 상수 설정값이다. 각각의 설정 값이 비트 단위와 딱 맞아떨어져, 여러 값이 설정되도 서로 다른 비트를 침범하지 않아 여러 설정(flag)를 저장할 수 있..
PE Header _ IMAGE_NT_HEADERSPE 포맷의 실행 파일의 핵심 정보를 담고 있는 구조체이며, PE파일 signiture와 다시 두 개의 구조체로 나뉘어진다.1개의 4바이트 데이터와 2개의 구조체를 담고 있으며, 총 248 바이트로 구성되어 있다. typedef struct _IMAGE_NT_HEADERS { DWORD Signature; // 0x50450000 ("PE"0x00 0x00) IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER OptionalHeader; } IMAGE_NT_HEADERS32,*PIMAGE_NT_HEADERS32;1. signature_IMAGE_NT_HEADERS 의 시작(DOS 헤더의 e_lfanew offset..
PE(Portable Executeable)이란?Windows 운영 체제에서 사용되는 실행 파일, DLL(Dynamic Link Library), Object 코드, SYS 드라이버와 같은 파일을 위한 포맷이다. 우리가 흔히 접하는 exe 파일은 다음과 같이 PE File Format의 형태로 구성되어 있고, 크게 보면구조체 형태로 크기가 정해져 있는 실행 파일의 정보를 담고 있는 "PE Header"와,프로그램이 실행되었을 때 메모리로 옮겨져야할 코드들과 데이터들을 담고 있는 섹션인 "PE Body"로 이루어져 있다. PE Header먼저, PE 파일의 다양한 속성과 필수 정보를 담고 있는 PE Header부터 살펴본다. 앞에서 언급 했듯이, PE Header는 구조체 형태로 이루어져 있어 그 크기가 ..
BOF 원정대 - Level2 gremlin 1. 소스 int main(int argc, char *argv[]) { char buffer[16]; if(argc < 2) { printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 2. 어셈블리 코드 main+0xA 에서 argc인자값이 2이상인지를 체크해, 아닐 경우 "argv error\n" 를 출력하고 프로그램을 종료한다.main+0x23 부터는 ebp-0x10 (16 bytes) 떨어진 곳에 argv[1]의 값을 복사한 다음, 출력하고 프로그램을 종료한다. main 함수 스택에 256바이트의 저장 공간이 주어졌던 1번 문제와는 다르게, 이번 문제에서는..
C언어 _ new, delete흔히 동적 배열을 위해 메모리를 할당받거나, 해제할 때 쓰는 malloc과 free와 비슷하게 사용된다. (둘다 힙 메모리 영역을 할당하게 된다.) 사용방법int *ptr_malloc = (int *)malloc(sizeof(int) * 4); // with mallocint *ptr_new = new int[10]; // with new ! 동적으로 할당(malloc, new)를 해준 메모리 영역은 반드시 사용이 끝나면 각각 free, delete로 초기화를 해주어야 한다.! new나 malloc통해 생성하지 않은 클래스, 구조체는 스택에 할당된다. 메모리 해제 시:free(ptr_malloc);delete ptr_new[]; // delete의 경우에 대상이 배열인 경우..
연산자 오버로딩 #include "stdafx.h" class Box { private: int var01, var02; public: Box(int arg0, int arg1) : var01(arg0), var02(arg1) {} void Show() { printf("%d %d\n", var01, var02); } Box operator+(Box &old) { // box2 - old // myBox02 : addr // Automatically used by ptr! (&) printf("start op\n"); return Box(var01 + old.var01, var02 + old.var02); } }; int main() { Box myBox01(10, 20); Box myBox02(1, 2..
가상 함수#test01 #include "stdafx.h" class Parent { public: void Call() { printf("System!! executed Parent::Call!!\n"); } }; class Child : public Parent { public: void Call() { printf("System!! executed Child::Call!!\n"); } }; int main() { Parent P, *pP; Child C; pP = &P; pP->Call(); // parent pP = &C; pP->Call(); // parent } Parent 클래스 P와, Child클래스 C를 선언하였음.포인터 접근으로 Parent에서 Call 메소드를 실행하면 당연히 Pare..