목록Dot-Gabi/Reversing (6)
학사 나부랭이
어셈블리어는 16진수인 기계어를 사람이 쉽게 이해할 수 있도록 표현을 바꾼 것이며, 각 명령어는 기계어와 일대일로 완벽히 매칭 된다. 기본적으로 한 번에 하나씩만 수행할 수 있다. > PUSH 스택에 값을 저장한다. PUSH 후에는 스택이 4바이트 커지기에, 그리고 스택은 높은 주소에서 낮은 주소로 할당되기에 SP 레지스터는 4바이트 감소한다. ex) PUSH BP: BP 값을 스택에 PUSH || PUSH 5: 5를 스택에 PUSH > POP 스택의 끝에 있는 값을 가져온다. POP 후에는 스택이 4바이트 줄어들기에, SP 레지스터가 4바이트 증가한다. ex) POP BP: 스택 끝의 값을 꺼내서 BP에 저장 || POP CX: 스택 끝의 값을 꺼내서 CX에 저장 > MOV 지정한 값을 지정한 곳에 넣..
PE header - Section header 섹션은 실제 파일의 내용이 존재하는 부분으로, 각 섹션의 속성을 정의한 것이에요. PE 파일을 여러 섹션으로 나누었을 때 장점은, 프로그램의 안정성을 확보할 수 있다는 점인데요. 코드와 데이터가 하나의 섹션으로 되어있고, 섞여있다면, 구현이 가능하긴 하지만 복잡성은 둘째 치더라도 데이터에 값을 쓰다가 오버플로우로 인해 코드를 오염시켜 뻗어버리는 등 안정성에 문제가 생길 수 있어요. 그래서 각각 성격(특징, 액세스 권한)에 따라 나누게 되었죠. 1. 코드 - 실행, 읽기 권한 .text: 파일을 열었을 때, 실행될 코드 저장 2. 데이터 - 비실행, 읽기, 쓰기 권한 .data: 초기화된 전역 변수, static 변수 저장 .rdata: const 변수, 문..
PE header - NT header 아래는 NT header 구조체 _IMAGE_NT_HEADERS이에요. 3개의 멤버가 있으며, 위는 64비트, 아래는 32비트용이죠. F8h(=16진수 F8 = 10진수 248)바이트로 상당히 큰 구조체예요. PE header - NT header - Signature 4바이트의 0x4550h("PE"00)이라는 값을 가지며, 변경할 수 없어요. PE 구조를 가진 파일이라는 것을 명시해주죠. PE header - NT header - FileHeader 파일의 대략적인 속성을 나타내요. 여기에는 다시 몇 가지의 멤버들이 있어요. 이 멤버 중 중요한 4가지 멤버들은 볼드처리 할게요. 이 값들이 정확히 설정되지 않으면 정상적인 실행이 불가능하죠. 1. Machine M..
PE header - DOS header 마이크로소프트는 PE 파일의 포맷을 만들 때, 당시 사용되던 DOS 파일에 대한 하위 호환성을 고려해서 만들었어요. 그로 인해, PE 헤더의 맨 앞에는 기존 DOS EXE header를 확장시킨 IMAGE_DOS_HEADER 구조체가 존재하죠. 이 구조체의 크기는 40h 즉, 64 바이트이고 여기서 중요한 멤버인 e_magic은 DOS signature(5A4Dh, ASCII: "MZ"), e_lfanew는 NT header의 오프셋(가변적)을 표시해요. 모든 PE 파일은 시작 부분(e_magic)에 DOS signature("MZ")가 있고, e_lfanew 값이 가리키는 위치에 NT header 구조체가 존재해야 해요. 파일에서의 PE 파일을 분석해보면, 0부..
Portable Executable PE는 윈도우에서 정의한 파일 포맷으로 직간접적으로 실행하는 파일이에요. 실행 파일 exe, scr 오브젝트 파일 obj 라이브러리 파일 dll, ocx 드라이버 파일 sys 이 중 obj 파일을 제외하고는 직간접적으로 실행 가능한 파일이에요. 예를 들어 dll과 sys 파일 등은 shell에서 직접 실행할 수는 없지만 디버거, 서비스 등을 이용해 실행가능하죠. 위 사진은 어떤 실행 파일(exe)의 시작 부분이자 PE 파일의 헤더 부분이에요. 여기에 어떻게 메모리에 적재될 것이며 어디서 시작할 건지, 실행할 때 필요한 DLL 등 asdf.exe가 실행되기 위한 모든 정보들이 구조체 형식으로 저장되어 있죠. 기본 구조 헤더에는 파일 실행을 위한 기본 정보, 메모리 상대 ..
Regiser CPU 내부에서 사용되는 매우 고속인 메모리인며, CPU가 연산을 위해 메모리에 있는 데이터들을 레지스터에 두어요. 연산을 하는 중에도 연산 결과를 레지스터에 저장하기도 해요. AX (Accumulator) 산술 및 논리 연산 수행, 함수의 반환값 저장 BX (Base) 데이터의 주소를 가리키는 포인터 CX (Counter) 반복 카운터 저장에 사용 - CX에 반복할 횟수를 지정 DX (Data) AX의 보조, IO 명령 SI (Source Index) 데이터 조작 및 복사(스트림 명령) 시 원본 데이터의 주소 저장 DI (Destination Index) 복사 시 목적지의 주소 저장 BP (Stack Base Pointer) 스택 프레임의 시작(베이스) 주소 저장 SP (Stack Poi..