[Reversing] Printf()함수 스택프레임(Stack Frame) [Reversing] 스택프레임(Stack Frame)이전 게시물의 예제 중 printf("%d\n", x); 부분에 대해 간략하게 설명을 하겠습니다. printf() 함수 호출4010BB PUSH PROJECT1.41C798- 해당 41C798 주소에는 "%d\n" 문자가 있는걸 알수있습니다.[printf() 함수 호출 전 PUSH 부분] - printf() 함수의 스택 프레임을 생성합니다. 다음을 보시게 되면 순서데로 작성해보겠습니다. PUSH EBP- 스택에 현재의 EBP를 저장합니다. MOV EBP, ESP- printf()의 ESP 값을 EBP에 옮겨주었습니다. PUSH ESI- 스택에 ESI를 저장합니다.- ESI는 데..
[Reversing] 스택프레임(Stack Frame) 스택프레임- 새로운 함수가 호출 될 때 호출 후 원래의 위치로 돌아갈 정보를 담고 있습니다.- ESP, EBP 레지스터를 사용해서 변수나 원복주소에 접근하는 방식입니다.- 즉, 함수가 호출 될때 그 함수가 가지는 공간 구조입니다.함수를 호출할 때 그 함수가 가지고 있는 공간으로 스택 프레임 구조는 함수 프롤로그 - 함수 원형 - 함수 에필로그로 구분할 수 있다. 스택 프레임 예제#include int main(){int x;printf("정수입력 : ");scanf_s("%d", &x);printf("%d\n", x);return 0;}[소스코드] 스택 프레임의 구조[예제 스택프레임 구조] [main() 함수의 스택 프레임] x64 dbg- 우선 m..
[Reversing] 가능한 가장 작은 PE 실행 파일 만들기(Tiny PE) 가능한 가장 작은 PE 실행 파일 만들기(Tiny PE) ① 이전 IMAGE_DOS_Header와 MS-DOS_Stub 수정 후 크기는 변하지 않았습니다. 다음으로는 SECTION.data을 확인해보겠습니다. 그런데 PE구조를 다시 보니 리소스 부분을 먼저 삭제를 해야 될꺼같습니다. 1. SECTION.rsrc 삭제하기 peview를 통해 해당 SECTION.rsrc 영역을 확인 후 Hxd에서 리소스 부분을 삭제를 했습니다. 삭제 후 확인 해보면 SECTION.rsrc 영역이 삭제 된걸 확인 할 수 있습니다. 파일을 실행 하게 되면 실행이 되지 않습니다. 실행이 되도록 만들어야 되겠지요. 이제 리소스를 참조한 부분을 찾아 수정..
[Reversing] 가능한 가장 작은 PE 실행 파일 만들기(Tiny PE) 가능한 가장 작은 PE 실행 파일 만들기(Tiny PE)PE 파일의 전체 구조를 보며, 불필요한 부분을 삭제하고 변경을 통해 크기를 줄이는 목적으로 작성하겠습니다. 파일 최초 크기8,704 바이트 이며, 실행 시 Hello World가 출력됩니다. 파일 전체 구조 1. IMAGE_DOS_HEADER와 MS-DOS_Stub 1.1 IMAGE_DOS_HEADERIMAGE_DOS_Header의 구조체를 확인 했을 때 구조체 중 "e_magic" 필드와 "e_lfanew" 필드가 가장 중요하다고 합니다. e_magic : DOS Signature [4D5A → MZ]e_lfanew : NT Header offset [E0000000 ..
[Reversing] IMAGE_SECTION_HEADER 1. IMAGE_SECTION_HEADER IMAGE_SECTION_HEADER 입니다.IMAGE_SECTION_HEADER는 각각 섹션에 대한 정보가 저장되어 있습니다.typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfR..
[Reversing] PE 포맷(Portable Executable) 참조 - Windows 시스템 실행파일의 구조와 원리 (이해한데로 정리해본다.) PE란?PE 파일은 위도우상에서 실행 가능한 포맷(Common Object File Format)으로 dll, exe, obj, sys 확장자 등이 있다. 또한, 크게 헤더와 섹션으로 나눌수 있으며, 헤더는 파일 실행에 있어 전반적인 정보를 가지고 있다. 섹션은 dll과 api 정보, 어셈블리 코드등 실제 내용을 담고 있다. IMAGE_FILE_HEADER는 PE 파일의 파일 정보를 나타내고 IMAGE_OPTIONAL_HEADER는 PE 파일이 메모리에 로드 될 때 필요한 모든 정보들을 담고 있다. 추가적으로 주요 섹션들과 정보들의 위치와 크기를 나타내는 ..
[Reversing] IMAGE_NT_HEADER IMAGE_NT_HEADERtypedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; 위 그림은 IMAGE_NT_HEADER 구조체입니다. 해당 구조체는 4byte 크기의 Signature 그리고 IMAGE_FILE_HEADER, IMAGE_OPTIONAL_HEADER32이 있습니다. 1.1 Signature가장 먼저 Signature입니다. IMAGE_NT_HEADER 구조체의 시작부분인 Signature는 실행파일이 ..
[Reversing] IMAGE_DOS_HEADER IMAGE_DOS_HEADER typedef struct _IMAGE_DOS_HEADER{ WORD e_magic; WORD e_cblp; WORD e_cp; WORD e_crlc; WORD e_cparhdr; WORD e_minalloc; WORD e_maxalloc; WORD e_ss; WORD e_sp; WORD e_csum; WORD e_ip; WORD e_cs; WORD e_lfarlc; WORD e_ovno; WORD e_res[4]; WORD e_oemid; WORD e_oeminfo; WORD e_res2[10]; LONG e_lfanew;} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; 위에 보이는 것이 IMAGE_..