목록Dot-Gabi (43)
학사 나부랭이
어셈블리어는 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가 실행되기 위한 모든 정보들이 구조체 형식으로 저장되어 있죠. 기본 구조 헤더에는 파일 실행을 위한 기본 정보, 메모리 상대 ..
휘발성 정보 수집을 위해서 윈도우에서 기본적으로 지원하는 명령어나 프로그램을 이용하기도 하고 인터넷에서 검증된 라이브 포렌식 프로그램을 사용해 수집하기도 하는데 이런 툴들을 사용하기 위해서는 당 시스템의 관리자 권한이 필요해요. 관리자 권한을 얻는 방법으로는 단순히 로그오프 후 관리자로 로그인, Buffer OverFlow 등이 있는데 전자는 로그오프 시 해당 세션의 휘발성 정보들이 사라질 수 있고 후자는 다음과 같은 이유가 있어서 사용할 수 없어요. 후자의 예로서 윈도우에서는 Runas라는 명령어로 일시적인 관리자 권한을 얻을 수 있어요. 이를 리눅스의 su처럼 해당 세션은 유지시키며 관리자 권한도 계속 유지하는 방법은 없진 않지만 시스템에 어떤 영향을 미칠지 모르는 프로그램들이 대부분이라 사용하지 않..
여태까지 동적 링크 라이브러리, 동적으로 컴파일할 때 필요한 파일이라고 두리뭉실하게 설명했는데, 라이브러리는 다른 프로그램에서 이용하는 함수들을 모아둔 곳이에요. 그러나 DLL은 표준 C 라이브러리 같은 일반 라이브러리의 파일과는 구조나 사용법이 달라요. Static Linking Library 일반 라이브러리는 소스 코드를 컴파일한 결과로 생성되는 오브젝트 파일을 그대로 모아둔 것이에요. 그리고 링커(Linking 단계에서)가 이 일반 라이브러리 파일 중, 필요한 함수가 포함된 오브젝트 파일을 꺼내서 실행 파일에 결합하는게 정적 링크 방식이에요. 정적 라이브러리르 사용하려면 프로젝트 설정의 Link 옵션에 라이브러리를 추가해주거나 #pragma comment(;ib, "asdf.lib")처럼 #prag..
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..