(Microsoft Word - \271\253\267\302\310\2552.doc)
|
|
- 예림 길
- 6 years ago
- Views:
Transcription
1 SDT Hooking 무력화에대한연구 By Dual5651 ( 요약 : 이문서는 Windows 2000/XP/2003 환경에서의 SSDT Hooking 을무력화시키는방법에대한필자의연구내용을다루고있습니다. 이문서는독자가 SSDT Hooking 에대하여알고있다는전제하에쓰여졌습니다.
2 1. 소개 - SSDT Hooking SSDT 란 System Service Descriptor Table 의약자로써 Window 의 API 들의실제함수의주소들이저장되어있는 Table 입니다. Kernel 단에서의처리가필요한 API 들은해당 API 의 Service Index 를이용하여 SSDT 에서해당함수의실제주소를얻어호출합니다. SSDT 는 Kernel 단의 Memory 에존재하는데, SSDT 는 Process 독립적인부분이아닙니다. 즉어떠한조작을하지않는한모든 Application 들은모두같은 Table 을참조하고있는것입니다. 그럼으로 SSDT 를수정하여주면시스템전역적인 API Hooking 을할수있습니다. 이러한이유로수많은 Rootkit 들이 SSDT Hooking 을사용하고있으며, Virus Engine 의동작기반 Virus 탐지기술에도사용되고있습니다. 2. Windows Internals Ring3 에서 Ring0 로 Service 호출을할때, Windows 2000 까지는 int 0x2e 를사용하였으며, Windows XP 부터는 sysenter 를사용하여 Ring0 로전환하고있습니다. Kernel 단의처리가필요한 API 가실제로어떠한호출과정을거치는지 CreateFile() 의호출과정을통해보도록하겠습니다 Ring Application 에서 CreateFile 호출 Kernel32.dll 의 CreateFileA() 호출됨. Kernel32.dll 의 CreateFileW() 호출됨.
3 ntdll.dll 의 NtCreateFile() 호출됨. 위의코드는 ntdll 의 NtCreateFile() 를 Disassemble 한것인데, eax 의값은호출하고자하는 Native API 의 Service Index 이고, edx 의값은 KiSystemCallEntry() 의주소를가진포인터값입니다. ntdll.dll 의 KiFastSystemCall() 호출됨. 현재 ESP 값을 EDX 에저장시키고 SYSENTER 명령어를실행시킨다. SYSENTER 명령어는 MSR 중 IA32_SYSENTER_EIP(0x176) 번에저장되어있는함수를실행시킵니다 Ring ntoskrnl.exe 의 KiFastCallEntry() 호출됨. 어떠한조작을가하지않는한 IA32_SYSENTER_EIP 에는 KiFastCallEntry() 의주소가저장되어있습니다. KiFastCallEntry() 는 Kernel 단에서필요한작업을처리하기위한준비작업을합니다. KiFastCallEntry() 는현재 Thread 의 ETHREAD 구조체의 ServiceTable 를읽어서 Table 의주소를구합니다. 조작을가하지않는한 EPROCESS 의 ServiceTable 에는 System Thread 라면 ntoskrnl.exe 에의해 export 되어지는 KeServiceDescriptorTable 의주소가, GUI Thread 라면 KeServiceDescriptorTableShadow 의주소가담겨있습니다.
4 ntoskrnl.exe 의 ZwCreateFile() 호출됨. eax 레지스터로넘어온 Service Index 를참조하여 KiFastCallEntry() 는 SSDT 에서실제함수의주소를구해호출합니다 Ring ntdll.dll 의 KiSystemCallRet() 호출됨 KiFastCallEntry() 에의해실제함수의 Call 처리가완료된후, SYSEXIT 명령을이용하여 Ring3 로돌아오게됩니다. ntdll.dll 의 NtCreateFile() 로리턴됨. kernel32.dll 의 CreateFileW() 로리턴됨. kernel32.dll 의 CreateFileA() 로리턴됨. Application 의코드로리턴됨. Kernel 단의처리가필요한 API 들은대부분위와같은과정을통해수행되어집니다. 이떄 Hooking 할수있는기회는다음과같습니다. Ring 3 : 1) Application 의 Import Descriptor Table 에서 CreateFileA() 의주소수정 2) kernel32.dll 의 Export Descriptor Table 에서 CreateFileA() 의주소수정 3) kernel32.dll 의 Import Descriptor Table 에서 NtCreateFile() 의주소수정 3) kernel32.dll 의 CreateFileA() Inline Hooking 4) kernel32.dll 의 CreateFileW() Inline Hooking 5) ntdll.dll 의 Export Descriptor Table 에서 NtCreateFile() 의주소수정 6) ntdll.dll 의 NtCreateFile() Inline Hooking or HotByte Hooking 7) ntdll.dll 의 KiFastSystemCall() Inline Hooking
5 Ring 0 : 1) MSR 의 IA32_SYSENTER_EIP(0x176) 번수정 - Sysenter Hooking or IDT 의 0x2e 번수정 - KiSystemService() Hooking 2) KiFastCallEntry() Inline Hooking 3) KiSystemService() Inline Hooking 4) SSDT Hooking 5) NTAPI Inline Hooking 위와같이공격자입장에서는 Hooking 할기회가많이있습니다. 이글에서위의모든내용을다루는방법이나방어법에관하여모두다를수는없습니다. 하지만이미 NET 상에는해당방법에관한많은문서들이올라와있음으로어렵지않게자료를구하실수있을겁니다. 3. SSDT Hooking 무력화의원리와코드 1) SDT-RESTORE by Chew Keong TAN SIG^2 G-TEC Lab 에의해발표된방법입니다. 핵심적인것은 Ring3 에서 \device\physicalmemory Section 을 NtOpenSection() 로열어 Kernel Memory 에접근할수있다는점과, NtQuerySystemInformation() 을이용하여 ntoskrnl.exe 가로드되어있는 Base 주소를구할수있다는점, ntdll.dll 의 Export Table 에는 KiServiceTable 에존재하는함수들의이름이모두존재한다는것입니다. 코드의내용중중요한부분을살펴보도록하겠습니다. BOOL getnativeapis(void) HMODULE hntdll; hntdll = GetModuleHandle("ntdll.dll"); *(FARPROC *)&_RtlAnsiStringToUnicodeString = GetProcAddress(hntdll, "RtlAnsiStringToUnicodeString"); *(FARPROC *)&_RtlInitAnsiString = GetProcAddress(hntdll, "RtlInitAnsiString"); *(FARPROC *)&_RtlFreeUnicodeString = GetProcAddress(hntdll, "RtlFreeUnicodeString"); *(FARPROC *)&_NtOpenSection = GetProcAddress(hntdll, "NtOpenSection"); *(FARPROC *)&_NtMapViewOfSection =
6 GetProcAddress(hntdll, "NtMapViewOfSection"); *(FARPROC *)&_NtUnmapViewOfSection = GetProcAddress(hntdll, "NtUnmapViewOfSection"); *(FARPROC *)&_NtQuerySystemInformation = GetProcAddress(hntdll, "ZwQuerySystemInformation"); if(_rtlansistringtounicodestring && _RtlInitAnsiString && _RtlFreeUnicodeString && _NtOpenSection && _NtMapViewOfSection && _NtUnmapViewOfSection && _NtQuerySystemInformation) return TRUE; return FALSE; GetModuleHandle() 을이용하여현재 Application 에 Load 되어있는 ntdll.dll 의 Base 주소를구해온후, GetProcAddress() 를사용하여사용할함수들의주소를구해오는함수입니다. HANDLE openphymem() HANDLE hphymem; OBJECT_ATTRIBUTES oattr; ANSI_STRING astr; _RtlInitAnsiString(&aStr, "\\device\\physicalmemory"); UNICODE_STRING ustr; if(_rtlansistringtounicodestring(&ustr, &astr, TRUE)!= STATUS_SUCCESS) return INVALID_HANDLE_VALUE; oattr.length = sizeof(object_attributes); oattr.rootdirectory = NULL; oattr.attributes = OBJ_CASE_INSENSITIVE; oattr.objectname = &ustr; oattr.securitydescriptor = NULL; oattr.securityqualityofservice = NULL; if(_ntopensection(&hphymem, SECTION_MAP_READ SECTION_MAP_WRITE, &oattr )!= STATUS_SUCCESS) return INVALID_HANDLE_VALUE;
7 return hphymem; ntdll 의 NtOpenSection() 를이용하여 \\device\\physicalmemory 를 READ & WRITE 권한으로열어옵니다. LPVOID loaddll(char *dllname) char modulefilename[max_path + 1]; LPVOID ptrloc = NULL; MZHeader mzh2; PE_Header peh2; PE_ExtHeader pexh2; SectionHeader *sechdr2; GetSystemDirectory(moduleFilename, MAX_PATH); if((mystrlena(modulefilename) + mystrlena(dllname)) >= MAX_PATH) return NULL; strcat(modulefilename, dllname); // load this EXE into memory because we need its original Import Hint Table HANDLE fp; fp = CreateFile(moduleFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(fp!= INVALID_HANDLE_VALUE) BY_HANDLE_FILE_INFORMATION fileinfo; GetFileInformationByHandle(fp, &fileinfo); DWORD filesize = fileinfo.nfilesizelow; //printf("size = %d\n", filesize); if(filesize) LPVOID exeptr = HeapAlloc(GetProcessHeap(), 0, filesize); if(exeptr) DWORD read; if(readfile(fp, exeptr, filesize, &read, NULL) && read == filesize) if(readpeinfo((char *)exeptr, &mzh2, &peh2, &pexh2, &sechdr2))
8 int imagesize = calctotalimagesize(&mzh2, &peh2, &pexh2, sechdr2); //ptrloc = VirtualAlloc(NULL, imagesize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); ptrloc = HeapAlloc(GetProcessHeap(), 0, imagesize); if(ptrloc) loadpe((char *)exeptr, &mzh2, &peh2, &pexh2, sechdr2, ptrloc); HeapFree(GetProcessHeap(), 0, exeptr); CloseHandle(fp); return ptrloc; 시스템디렉토리에서인자로넘어온프로그램을열어메모리를할당하여 EXCUTE & READ & WRITE 권한으로메모리를할당하고로드하는역할을합니다. DWORD procapiexportaddr(dword hmodule, char *apiname) if(!hmodule!apiname) return 0; char *ptr = (char *)hmodule; ptr += 0x3c; // offset 0x3c contains offset to PE header ptr = (char *)(*(DWORD *)ptr) + hmodule + 0x78; // offset 78h into PE header contains addr of export table ptr = (char *)(*(DWORD *)ptr) + hmodule; // ptr now points to export directory table // offset 24 into the export directory table == number of entries // in the Export Name Pointer Table // table DWORD numentries = *(DWORD *)(ptr + 24); //printf("numentries = %d\n", numentries);
9 DWORD *ExportNamePointerTable = (DWORD *) (*(DWORD *)(ptr + 32) + hmodule); // offset 32 into export directory contains offset to Export Name Pointer Table DWORD ordinalbase = *((DWORD *)(ptr + 16)); //printf("ordinalbase is %d\n", ordinalbase); WORD *ExportOrdinalTable = (WORD *) ((*(DWORD *)(ptr + 36)) + hmodule); // offset 36 into export directory contains offset to Ordinal Table DWORD *ExportAddrTable = (DWORD *) ((*(DWORD *)(ptr + 28)) + hmodule); // offset 28 into export directory contains offset to Export Addr Table for(dword i = 0; i < numentries; i++) char *exportname = (char *)(ExportNamePointerTable[i] + hmodule); if(mystrcmpa(exportname, apiname) == TRUE) WORD ordinal = ExportOrdinalTable[i]; //printf("%s (i = %d) Ordinal = %d at %X\n", // exportname, i, ordinal, ExportAddrTable[ordinal]); return (DWORD)(ExportAddrTable[ordinal]); return 0; 첫번쨰인자로넘어온 Base 주소에 Load 되어있는 PE 포맷을가진파일로부터두번쨰인자로넘어온이름을 Export Descriptor Table 에서찾아서리턴하여줍니다. DWORD getkernelbase(void) HANDLE hheap = GetProcessHeap(); NTSTATUS Status; ULONG cbbuffer = 0x8000; PVOID pbuffer = NULL; DWORD retval = DEF_KERNEL_BASE; do pbuffer = HeapAlloc(hHeap, 0, cbbuffer);
10 if (pbuffer == NULL) return DEF_KERNEL_BASE; Status = _NtQuerySystemInformation(SystemModuleInformation, pbuffer, cbbuffer, NULL); if(status == STATUS_INFO_LENGTH_MISMATCH) HeapFree(hHeap, 0, pbuffer); cbbuffer *= 2; else if(status!= STATUS_SUCCESS) HeapFree(hHeap, 0, pbuffer); return DEF_KERNEL_BASE; while (Status == STATUS_INFO_LENGTH_MISMATCH); DWORD numentries = *((DWORD *)pbuffer); SYSTEM_MODULE_INFORMATION *smi = (SYSTEM_MODULE_INFORMATION *)((char *)pbuffer + sizeof(dword)); for(dword i = 0; i < numentries; i++) if(strcmpi(smi->imagename, "ntoskrnl.exe")) //printf("%.8x - %s\n", smi->base, smi->imagename); retval = (DWORD)(smi->Base); break; smi++; HeapFree(hHeap, 0, pbuffer); return retval; NtQuerySystemInformation() 을이용하여 Process 목록을열거하고그중, "ntoskrnl.exe" 를찾아보고, 찾는데성공하면 Base 주소를리턴하여줍니다. BOOL mapphymem(handle hphymem, DWORD *phyaddr, DWORD *length, PVOID *virtualaddr) NTSTATUS ntstatus; PHYSICAL_ADDRESS viewbase; *virtualaddr = 0;
11 viewbase.quadpart = (ULONGLONG) (*phyaddr); ntstatus = _NtMapViewOfSection(hPhyMem, (HANDLE)-1, virtualaddr, 0, *length, &viewbase, length,viewshare, 0, PAGE_READWRITE ); if(ntstatus!= STATUS_SUCCESS) printf("failed to map physical memory view of length %X at %X!", *length, *phyaddr); return FALSE; *phyaddr = viewbase.lowpart; return TRUE; 할당했던메모리를물리적주소를얻기위해메핑하는역할을합니다. BOOL buildnativeapitable(dword hmodule, char *nativeapinames[], DWORD numnames) if(!hmodule) return FALSE; char *ptr = (char *)hmodule; ptr += 0x3c; // offset 0x3c contains offset to PE header ptr = (char *)(*(DWORD *)ptr) + hmodule + 0x78; // offset 78h into PE header contains addr of export table ptr = (char *)(*(DWORD *)ptr) + hmodule; // ptr now points to export directory table // offset 24 into the export directory table == number of entries in the //Name Pointer Table // table DWORD numentries = *(DWORD *)(ptr + 24); DWORD *ExportNamePointerTable = (DWORD *)(*(DWORD *) (ptr + 32) + hmodule); // offset 32 into export directory contains offset to Export Name Pointer Table DWORD ordinalbase = *((DWORD *)(ptr + 16)); WORD *ExportOrdinalTable = (WORD *)((*(DWORD *) (ptr + 36)) + hmodule); // offset 36 into export directory contains offset to Ordinal Table DWORD *ExportAddrTable = (DWORD *)((*(DWORD *)
12 (ptr + 28)) + hmodule); // offset 28 into export directory contains offset to Export Addr Table for(dword i = 0; i < numentries; i++) // i now contains the index of the API in the Ordinal Table // ptr points to Export directory table WORD ordinalvalue = ExportOrdinalTable[i]; DWORD apiaddr = (DWORD)ExportAddrTable[ordinalValue] + hmodule; char *exportname = (char *)(ExportNamePointerTable[i] + hmodule); // Win2K if(gwinversion == 0 && *((unsigned char *)apiaddr) == 0xB8 && *((unsigned char *)apiaddr + 9) == 0xCD && *((unsigned char *)apiaddr + 10) == 0x2E) DWORD servicenum = *(DWORD *)((char *)apiaddr + 1); if(servicenum < numnames) nativeapinames[servicenum] = exportname; //printf("%x - %s\n", servicenum, exportname); // WinXP else if(gwinversion == 1 && *((unsigned char *)apiaddr) == 0xB8 && *((unsigned char *)apiaddr + 5) == 0xBA && *((unsigned char *)apiaddr + 6) == 0x00 && *((unsigned char *)apiaddr + 7) == 0x03 && *((unsigned char *)apiaddr + 8) == 0xFE && *((unsigned char *)apiaddr + 9) == 0x7F) DWORD servicenum = *(DWORD *)((char *)apiaddr + 1); if(servicenum < numnames) nativeapinames[servicenum] = exportname; //printf("%x - %s\n", servicenum, exportname); return TRUE; NativeAPI들의 Name배열을만듭니다.
13 for(dword i = 0; i < sdtcount; i++) if((servicetable[i] - PROT_MEMBASE - kerneloffset)!= fileservicetable[i]) printf("%-25s %3X --[hooked by unknown at %X]--\n", (nativeapinames[i]? nativeapinames[i] : "Unknown API"), i, servicetable[i]); hookcount++; 메모리에새롭게메핑한 ntoskrnl.exe 의함수주소와기존의 ntoskrnl.exe 의함수주소가같은지한개씩비교합니다. for(dword i = 0; i < sdtcount; i++) if((servicetable[i] - PROT_MEMBASE - kerneloffset)!= fileservicetable[i]) servicetable[i] = fileservicetable[i] + PROT_MEMBASE + kerneloffset; printf("[+] Patched SDT entry %.2X to %.8X\n", I, fileservicetable[i] + PROT_MEMBASE + kerneloffset); 기존의 ntoskrnl.exe 의함수주소를한개씩비교하면서새로할당한 ntoskrnl.exe 의함수주소와다르다면, 새로할당한 ntoskrnl.exe 의함수주소로바꿔줍니다. 정리 실행순서를다음과같이정리하여볼수있습니다. 1) Kernel Memory 를 Open 한다. 2) Memory 에 ntoskrnl.exe 를 Load 한다. 3) Load 한메모리에서 KeServiceDescriptorTable 의주소를구한다. 4) 커널의베이스주소를구해온다. 5) Load 한메모리를메핑한다. 6) NativeAPI Name 배열을만든다. 7) Hooking 된함수가있는지검사한다. 8) Hooking 된함수를정상주소로돌린다. 장점 Ring3 에서 ntdll 의함수들을이용하여 Kernel Memory 에존재하는 SSDT 를검사하고, 고쳐준다는점에서획기적입니다. 단점
14 Rootkit 에의해 \\device\\physicalmemory 을 Open 하는것이이전에막혀있을경우나 Administrator 의권한이아닐경우작동할수없습니다. 2) ServiceTable Relocation by Yeori System Thread 의경우 ServiceTable 로써, KeServiceDescriptorTable 을, GUI Thread 의경우 KeServiceDescriptorTableShadow 을사용한다고하였습니다. 이를확인해보기위해 System Process 의 Thread 와 A.exe 라는 User Application 의 Thread 에 ServiceTable 이각각가르키는주소를덤프하여보았습니다. KeServiceDescriptorTable : 8055B480 A8 46 4E C B8 1A B B4A B4B KeServiceDescriptorTableShadow : 8055B440 A8 46 4E C B8 1A B BF B BF 8055B B KeServiceDescriptorTableShadow 의경우두번째줄에 KeServiceDescriptor Table 의경우 0 으로되어있는부분에값이더들어있는것을볼수있습니다. 이는 GUI 관련처리를하기위해필요한 WINAPI Table 에대한것입니다. KeServiceDescriptorTable 과 KeServiceDescriptorTableShadow 를각각 C 구조체로나타내보면다음과같습니다. typedef struct ServiceDescriptorEntry unsigned int *ServiceTableBase; // 서비스테이블 unsigned int *ServiceCounterTableBase; //Debug 모드에만사용됨 unsigned int NumberOfServices; // 서비스의갯수 unsigned char *ParamTableBase; // 각서비스당 Param 의총크기 ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t; typedef struct ServiceDescriptorShadowEntry unsigned int *ServiceTableBase; // 서비스테이블 unsigned int *ServiceCounterTableBase; //Debug 모드에만사용됨 unsigned int NumberOfServices; // 서비스의갯수 unsigned char *ParamTableBase; // 각서비스당 Param 의총크기 unsigned int *Win32kTableBase; //WINAPI 서비스테이블
15 unsigned int *Win32kCounterTableBase; //Debug 모드에만사용됨 unsigned int NumberofWin32kServices; //WINAPI 서비스의갯수 unsigned char *Win32kParamTableBase; // 각서비스당 Param 의총크기 ServiceDescriptorTableShadowEntry_t, *PServiceDescriptorTableShadowEntry_t; KiFastCallEntry() 는요구된 NativeAPI 를처리하기위해직접적으로위의 ServiceDescriptorTable 들을사용하는것이아니라, 요청한 ETHREAD 의 ServiceTable 를참조한다고하였습니다. 그럼으로 ServiceDescriptorTable 을별도로만들고, ETHREAD 의 ServiceTable 을별도로만든 ServiceDescriptor Table 로연결시킨다면, SSDT Hooking 을해당 Thread 에한하여무력화시킬수있을것입니다. 이가정을전제로만든코드의핵심부분을보겠습니다. SDT = &KeServiceDescriptorTable; NewServiceTable = ExAllocatePool(NonPagedPool,(SDT->NumberOfServices) * 4); memcpy(newservicetable,sdt->servicetablebase,(sdt->numberofservices) * 4); Service 개수 * 4 의크기를가진메모리를할당하고, 그곳에본래 ServiceTable 에있던값들을전부복사하여넣습니다. OrgSDT = (PServiceDescriptorTableEntry_t)* (ethread + ThrdOffset_ServiceTable); //Thread 가가지고있던 Original ServiceTable 주소저장. DbgPrint("Original SDT : 0x%X",OrgSDT); SDT_s[ThreadCount] = OrgSDT; // 관리를위한테이블에저장해둔다. ETHREAD_s[ThreadCount] = ethread; // NewSDT[ThreadCount] = ExAllocatePool(NonPagedPool,128); // 새로운메모리할당 memcpy(newsdt[threadcount],orgsdt,128); // 복사한다. ServiceTable[ThreadCount] // 서비스테이블을위한메모리할당. = ExAllocatePool(NonPagedPool,(SDT->NumberOfServices) * 4); memcpy(servicetable[threadcount],newservicetable, (SDT->NumberOfServices) * 4); // 메모리를복사한다. DbgPrint("New Service Table : 0x%X",ServiceTable[ThreadCount]); NewSDT[ThreadCount]->ServiceTableBase = ServiceTable[ThreadCount]; // 관리를위한테이블에저장해둔다. g_pmdl_keservicetable[threadcount] = MmCreateMdl(NULL,NewSDT[ThreadCount],128); //MDL 을만든다.
16 MmBuildMdlForNonPagedPool(g_pmdl_KeServiceTable[ThreadCount]); g_pmdl_keservicetable[threadcount]->mdlflags =g_pmdl_keservicetable[threadcount]->mdlflags MDL_MAPPED_TO_SYSTEM_VA MDL_WRITE_OPERATION MDL_IO_PAGE_READ; //MDL 속성을변환한다. Mapped_KeServiceTable[ThreadCount] = MmMapLockedPages(g_pmdl_KeServiceTable[ThreadCount], KernelMode); DbgPrint("New SDT : 0x%X",Mapped_KeServiceTable[ThreadCount]); pmdl_sdt_pointer = MmCreateMdl(NULL, SDT_Pointer, 4); MmBuildMdlForNonPagedPool(pmdl_SDT_Pointer); pmdl_sdt_pointer->mdlflags = pmdl_sdt_pointer->mdlflags MDL_MAPPED_TO_SYSTEM_VA MDL_WRITE_OPERATION MDL_IO_PAGE_READ; Mapped_SDT_Pointer = MmMapLockedPages(pmdl_SDT_Pointer, KernelMode); *Mapped_SDT_Pointer = Mapped_KeServiceTable[ThreadCount]; // 새로만든 ServiceTable 을가르키도록한다. MmUnmapLockedPages(Mapped_SDT_Pointer,pmdl_SDT_Pointer); IoFreeMdl(pmdl_SDT_Pointer); //MDL 을해제한다. 위의코드가 SDT Relocation 의핵심적인부분입니다. 위의코드는완성되지는않았습니다. 그이유는 Thread 의생성단계에서는 Thread 의 ETHREAD 에 ServiceTable 은모두 KeServiceDescriptorTable 을포인트하다가, KiFastCallEntry() 에의해 Service 를처리할떄, KiFastCallEntry() 내에서내부적으로호출하는 PsConvertToGuiThread() 라는함수에의해서 WINAPI 의처리가필요할경우그때에 KeServiceDescriptorTable Shadow 를포인트하도록변하기때문입니다. 정리 실행순서를다음과같이정리하여볼수있습니다. 1) 기존의 ServiceTable 로부터함수들의주소들을복사한새로운 ServiceTable 을만든다. 2) 지정한 Process 의 Thread 들을트레이싱하면서각 ETHREAD 에대해새로운 SDT 를만들어준다. 3) PsSetCreateThreadNotifyRoutine() 에의해 THREAD 가동적생성이 Notify 되면, 해당 Thread 에대한 SDT 를만들어준다. 4) 사용자가기능을중지하기원하는경우, 각 Thread 의 ServiceTable 을저장해두었던, 것으로복구시키고, 사용했던메모리들을모두 Release 시킨다. 장점 ServiceTable 을새로만드는것임으로, SSDT Hooking 에영향을받지않습니다.
17 단점현재 Code 로는동적으로생성된 GUI Thread 에대해서는처리할수없습니다. 3) KiFastCallEntry Imitation by Dual Kernel 단의처리가필요한함수들은 SYSENTER 에의해 Ring0 로변환된후, 처리된다고하였습니다. 이떄 SYSENTER 는 MSR 중, IA32_SYSENTER_EIP 를참조하여실행할함수를결정하는데, 이 IA32_SYSENTER_EIP 의값을 WRMSR 이라는명령어를통해덮어쓸수있습니다. 만약덮어씀으로써, 새롭게연결된함수에서 KiFastCallEntry() 의기능을수행할수있지만, ETHREAD 의 ServiceTable 을참조하여, 그 ServiceTable 을사용하는것이아니라, 내부적인 ServiceTable 을사용한다면, SSDT Hooking 을전역적으로무력화시킬수있을것입니다. 그럼핵심코드를보도록하겠습니다. VOID InitializeEngine() UNICODE_STRING y; IDTINFO idt_info; IDTENTRY* idt_entries; unsigned int i; DbgPrint("KiFastCallEntry Imitation coded by Dual"); DbgPrint("ProcessorCount : 0x%X",KeNumberProcessors); // 프로세서의갯수를구해온다. gdpcp1 = ExAllocatePool(NonPagedPool,sizeof(KDPC)); KeInitializeDpc(gDPCP1,WRMSRDPC,NULL); gdpcp2 = ExAllocatePool(NonPagedPool,sizeof(KDPC)); KeInitializeDpc(gDPCP2,RestoreMSR,NULL); //DPC 를위한메모리들을할당해둔다. GetProcessNameOffset(); //EPROCESS 에서 Name 까지의 Offset DbgPrint("ProcessName Offset : 0x%X",gProcessNameOffset); DbgPrint("Engine_KiFastCallEntry : 0x%8X",MyKiFastCallEntry); asm mov ecx, 0x176 rdmsr mov d_origkifastcallentry, eax //KiFastCallEntry 의주소를구해온다. DbgPrint("KiFastCallEntry : 0x%8X",d_origKiFastCallEntry);
18 PsConvertToGuiThread = findaddressofpsconverttoguithread(); //PsConvertToGuiThread 의주소를구해온다. DbgPrint("PsConvertToGuiThread : 0x%8X",PsConvertToGuiThread); _MmUserProbeAddress = *MmUserProbeAddress; DbgPrint("MmUserProbeAddress : 0x%8X",_MmUserProbeAddress); DbgPrint("KeServiceDescriptorTable : 0x%8X",&KeServiceDescriptorTable); DbgPrint("KiServiceTable : 0x%8X",KeServiceDescriptorTable.ServiceTableBase); DbgPrint("ArguementTable : 0x%8X",KeServiceDescriptorTable.ParamTableBase); DbgPrint("Service Limit : 0x%X",KeServiceDescriptorTable.NumberOfServices); //Make New Service Table OrgServiceTable = KeServiceDescriptorTable.ServiceTableBase; NewServiceTable = ExAllocatePool(NonPagedPool, (KeServiceDescriptorTable.NumberOfServices) * 4); memcpy(newservicetable, KeServiceDescriptorTable.ServiceTableBase, (KeServiceDescriptorTable.NumberOfServices) * 4); DbgPrint("NewServiceTableBase : 0x%8X",NewServiceTable); KeServiceDescriptorTableShadow = (PServiceDescriptorTableShadowEntry_t)findAddressofShadowTable(); ShadowSDT = (ULONG)KeServiceDescriptorTableShadow; KeServiceDescriptorTableShadow += 0x1; DbgPrint("KeServiceDescriptorTableShadow : 0x%8X", KeServiceDescriptorTableShadow); DbgPrint("Win32KServiceTable : 0x%8X", KeServiceDescriptorTableShadow->Win32kTableBase); DbgPrint("Win32kArguementTable : 0x%8X", KeServiceDescriptorTableShadow->Win32kParamTableBase); DbgPrint("Win32kService Limit : 0x%X", KeServiceDescriptorTableShadow->NumberofWin32kServices); RtlInitUnicodeString(&y,L"KeRaiseIrql"); _KeRaiseIrql = MmGetSystemRoutineAddress(&y); DbgPrint("KeRaiseIrql : 0x%8X",_KeRaiseIrql); RtlInitUnicodeString(&y,L"KeLowerIrql"); _KeLowerIrql = MmGetSystemRoutineAddress(&y); DbgPrint("KeLowerIrql : 0x%8X",_KeLowerIrql); RtlInitUnicodeString(&y,L"KiDeliverApc"); _KiDeliverApc = MmGetSystemRoutineAddress(&y); DbgPrint("KiDeliverApc : 0x%8X",_KiDeliverApc); RtlInitUnicodeString(&y,L"KeGetCurrentIrql"); _KeGetCurrentIrql = MmGetSystemRoutineAddress(&y);
19 DbgPrint("KeGetCurrentIrql : 0x%8X",_KeGetCurrentIrql); asm sidt idt_info idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase); _KiTrap6 = MAKELONG(idt_entries[0x6].LowOffset,idt_entries[0x6].HiOffset); DbgPrint("KiTrap06 : 0x%8X",_KiTrap6); KiFastCallEntry() 를구현하는데있어서필요한함수들의주소를구해오는기능을합니다. Case StartHook: for(i = 0; i < KeNumberProcessors; i++) KeSetTargetProcessorDpc(gDPCP1,i); KeInsertQueueDpc(gDPCP1,&tmp,&tmp); 미리구해둔프로세서의개수만큼반복하면서, 각프로세서의 MSR 에 IA32_SYSENTER_EIP 을새로만든 KiFastCallEntry() 의주소로덮어씁니다. 이유는멀티프로세서환경에서각프로세서마다별도의 MSR 들을가지고있기때문에정상적인처리를위해선전부처리해주어야합니다. VOID WRMSRDPC(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID sys1, IN PVOID sys2) ULONG ProcessorFastCallEntry; DbgPrint("Processor Number : 0x%X",KeGetCurrentProcessorNumber()); asm mov ecx,0x176 mov edx,0 mov eax,mykifastcallentry wrmsr asm mov ecx,0x176 rdmsr mov ProcessorFastCallEntry,eax
20 if(processorfastcallentry == (ULONG)MyKiFastCallEntry) DbgPrint("Install Success"); else DbgPrint("Install Faild"); VOID RestoreMSR(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID sys1, IN PVOID sys2) ULONG ProcessorFastCallEntry; DbgPrint("Processor Number : 0x%X",KeGetCurrentProcessorNumber()); asm mov ecx,0x176 mov edx,0 mov eax,d_origkifastcallentry wrmsr asm mov ecx,0x176 rdmsr mov ProcessorFastCallEntry,eax if(processorfastcallentry == d_origkifastcallentry) DbgPrint("Restore Success"); else DbgPrint("Restore Faild"); 위에것은설치함수이고, 밑에것은복구함수입니다. DWORD findaddressofshadowtable(void) int i; unsigned char *p; DWORD val;
21 p = (unsigned char *)KeAddSystemServiceTable; for (i = 0; i < PAGE_SIZE; i++, p++) try val = *(unsigned int *)p; except (EXCEPTION_EXECUTE_HANDLER) return 0; if (MmIsAddressValid((PVOID)val)) if (memcmp((pvoid)val, &KeServiceDescriptorTable, 16) == 0) if((pvoid)val!= &KeServiceDescriptorTable) return val; return 0; DWORD findaddressofpsconverttoguithread(void) int i; unsigned char *p; ULONG val; static char Adr[4]; char CodePattern[3] = 0x52,0x53,0xE8; char PsCovertPattern[3] = 0x6A,0x38,0x68; p = (unsigned char *)d_origkifastcallentry - PAGE_SIZE; for(i = 0; i < PAGE_SIZE*2; i++,p++) if(!memcmp(p,codepattern,3)) val = *(ULONG *)(p + 3) + (ULONG)p + 7; if(mmisaddressvalid((pvoid)val)) if(!memcmp((pvoid)val,pscovertpattern,3)) return val; else
22 return 0; return 0; 위에것은 ShadowTable 의주소를구해오는함수이고, 밑에것은 PsConvertToGuiThread 의주소를구해오는함수입니다. KeServiceDescriptorTableShadow 와 PsConverToGui Thread 의경우 export 되지않기떄문에, 재가아는한에서는위와같은방법으로구할수밖에없었습니다. 더좋은방법을알고계시다면저에게연락해주세요. :) declspec(naked) MyKiFastCallEntry() asm // 세그 s 먼트셀렉터값지정 mov ecx,0x23 push 0x30 pop fs //FS 를 PCR 로지정 mov ds,cx mov es,cx // 현스택을커널스택으로변경 mov ecx,dword ptr fs:0x40 ////KPCR_TSS mov esp, ss:[ecx+0x4] // 가짜 INT 스택을만든다. push 0x23 //KGDT_R3_DATA + RPL_MASK(0x3) push edx //Ring3 ESP pushfd //Ring3 EFLAGS push 2 //Ring 0 EFLAGS add edx,8 //Skip user param popfd //Set EFLAGS or byte ptr [esp+0x1],0x2 // 가짜 INT 로 IRQ 재활성화 push 0x1B //RGDT_R3_CODE + RPL_MASK push KiFastSystemCallRet //sysenter리턴어드레스 push 0 push ebp push ebx push esi
23 push edi // 우리의 PCR 로포인터저장 mov ebx,dword ptr fs:0x1c push 0x38 + 0x3 //KGDT_R3_TEB + RPL_MASK // 현재스레드의포인터구함 mov esi,[ebx+0x124] // 예외핸들러체인종료자지정 push dword ptr[ebx] mov dword ptr[ebx],-1 // 스레드의스택사용 mov ebp,[esi+0x18] //KTHREAD_INITIAL_STACK push 0x1 //Usermode //push dword ptr[esi+0x140] //KTHREAD_PREVIOUS_MODE // 다른레지스터들을넘긴다. sub esp,0x48 //mov dword ptr [esp+0x38], 0x23 //mov dword ptr [esp+0x34], 0x23 // 스택에우리의공간을만든다. sub ebp,0x29c // 모드를써넣는다. mov byte ptr[esi+0x140],0x1 //KTHREAD_PREVIOUS_MODE DEBUG_STATUS: //Sanity check cmp ebp,esp jne BadStack //Flush DR7 and dword ptr[ebp+0x2c],0 // 스레드가디버깅당하는중인가? test byte ptr[esi+0x2c],0xff //KTHREAD_DEBUG_ACTIVE // 스레드의트렙프레임설정 mov [esi+0x134],ebp //KTHREAD_TRAP_FRAME 0x134? or 0x110? jnz Dr_FastCallDrSave
24 // 트렙프레임디버그헤드설정 mov ebx,dword ptr[ebp+0x60] mov edi,dword ptr[ebp+0x68] //KTRAP_FRAME_EBP //KTRAP_FRAME_EIP // 커널데이터기록 mov dword ptr[ebp+0xc],edx //KTRAP_FRAME_DEBUGPOINTER mov dword ptr[ebp+0x8],0xbadb0d00 //KTRAP_FRAME_DEBUGARGMARK mov dword ptr[ebp],ebx //stack 세이브 mov dword ptr[ebp+0x4],edi //KTRAP_FRAME_DEBUGEIP // 인터럽트활성화 sti /* SysCallEntry: 여기서 SDT를이용하여함수호출 */ ///////////////////////////////////////////////////////////// mov edi,eax shr edi,0x8 //SERVICE_TABLE_SHIFT and edi,0x30 //SERVICE_TABLE_MASK mov ecx,edi //add thread`s base system table to offset add edi,dword ptr[esi+0xe0] //KTHREAD_SERVICE_TABLE //GetSyscallID mov ebx,eax and eax,0xfff //SERIVCE_NUMBER_MASK //check syscallid cmp eax,dword ptr[edi+0x8] //SERVICE_DESCRIPTOR_LIMIT //Invalid? jnb UnexpectedRange //Check Win32K cmp ecx,0x10 //SERVICE_TABLE_TEST jnz NotWin32K //Get TEB mov ecx,dword ptr fs:0x18 //KPCR_TEB //check flush? xor ebx,ebx or ebx,dword ptr[ecx+0xf70] //TEB_GDI_BATCH_COUNT
25 je NotWin32K //=jz //Flust it push edx push eax call NtGdiFlushUserBatch pop eax pop edx NotWin32K: //inc dword ptr fs:[0x638] inc dword ptr fs:0x638 //KPCR_SYSTEM_CALLS //KPCR_SYSTEM_CALLS //NoCountTable: mov esi,edx // 인자들공간확보 mov ebx,dword ptr[edi+0xc] //SERVICE_DESCRIPTOR_NUMBER xor ecx,ecx mov cl,byte ptr [eax+ebx] //Get the function point mov edi,dword ptr[edi] //Service_Descriptor_Base //Blocking SSDT Hooking cmp edi,orgservicetable jne Shadow Shadow: NotShadow: mov edi,newservicetable jmp NotShadow mov edi,newshadowtable mov ebx,dword ptr[edi+eax*4] // 우리스택공간확보 sub esp,ecx // 인자 & 목적지크기지정 shr ecx,2 mov edi,esp //MmUserProbeAddress인지확인 cmp esi,_mmuserprobeaddress jnb AccessViolation //0x7FFF0000 CopyParams:
26 rep movsd //call syscall call ebx AfterSyscall: mov esp,ebp ///////////////////////////////////////////////////////////// KeReturnFromSystemCall: mov ecx,dword ptr fs:0x124 //KPCR_CURRENT_THREAD // 프레임포인터복구 mov edx,dword ptr[ebp+0x3c] mov dword ptr[ecx+0x134],edx //KTHREAD_TRAP_FRAME 0x110? 0x134? //KTRAP_FRAME_EDX // 인터럽트비활성화 cli test dword ptr[ebp+0x70],0x20000 //KTHREAD_COMBINED_APC_DISABLE(0x70),EFLAGS_V86_MASK(0x20000) jnz SKIP_CS_TEST test byte ptr[ebp+0x6c],0x1 //KTRAP_FRAME_CS je SKIP_SAVE_FRAME SKIP_CS_TEST: // 현재스레드구함 //mov ebx,dword ptr fs:edx+0x124 //KPCR_CURRENT_THREAD mov ebx,dword ptr fs:0x124 mov byte ptr [ebx+0x2e],0 //KTHREAD_ALERTED 0x5E? 0x2E? cmp byte ptr[ebx+0x4a],0 je SKIP_SAVE_FRAME //KTHREAD_PENDING_USER_APC // 스텍포인터를트렙프레임에저장 mov ebx,ebp mov dword ptr[ebx+0x44],eax //KTRAP_FRAME_EAX mov dword ptr[ebx+0x50],0x3b //KTRAP_FRAME_FS<-KGDT_R3_TEB + RPL_MASK mov dword ptr[ebx+0x38],0x23 //KTRAP_FRAME_DS<-KGDT_R3_DATA + RPL_MASK mov dword ptr[ebx+0x34],0x23 //KTRAP_FRAME_ES<-KGDT_R3_DATA + RPL_MASK
27 mov dword ptr[ebx+0x30],0x0 //KTRAP_FRAME_GS //IRQL 을 APC LEVEL 로 mov ecx,1 // 과거 IRQL 저장 call _KeGetCurrentIrql //Hack for Hyper Thread push eax push offset TmpOldIrql //Temp for OldIrql push 1 //APC_LEVEL call _KeRaiseIrql // 인터럽트활성화 sti push ebx push 0x0 push 0x1 // 유저모드 call _KiDeliverApc // 과거 IRQL 로복귀 pop ecx push ecx //:) call _KeLowerIrql //EAX 복구 mov eax,dword ptr[ebx+0x44] //KTRAP_FRAME_EAX // 인터럽트비활성화 cli jmp SKIP_CS_TEST SKIP_SAVE_FRAME: //mov ds,[esp+0x38] //mov es,[esp+0x34] mov edi,edi mov edx,dword ptr[esp+0x4c] //KTRAP_FRAME_EXCEPTION_LIST mov ebx,dword ptr fs:[0x50] //KTRAP_FRAME_FS mov dword ptr fs:[0],edx mov ecx,dword ptr[esp+0x48] //KTRAP_FRAME_PREVIOUS_MODE mov esi,dword ptr fs:[0x124] //KPCR_CURRENT_THREAD mov byte ptr[esi+0x140],cl //KTHREAD_PREVIOUS_MODE test ebx,0xff //MAXIMUM_IDTVECTOR? jnz FullIDTVector
28 CHECK_FOR_V86: //Check for V86 test dword ptr[esp+0x70],0x20000 //KTRAP_FRAME_EFLAGS,EFLAGS_V86_MASK jnz V86_EXIT test word ptr[esp+0x6c],0xfff8 //KTRAP_FRAME_CS,FRAME_EDITED jz RestoreCS cmp word ptr[esp+0x6c],0x1b bt word ptr[esp+0x6c],0 cmc ja RestoreEAX //KGDT_R3_CODE + RPL_MASK cmp dword ptr[ebp+0x6c],0x8 //KTRAP_FRAME_CS,KGDT_R0_CODE jz SkipDebugInformation RestoreFS: //Restore FS lea esp,dword ptr[ebp+0x50] //KTRAP_FRAME_FS pop fs SkipDebugInformation: lea esp,dword ptr[ebp+0x54] //KTRAP_FRAME_EDI pop edi pop esi pop ebx pop ebp //ABIOS 를위한체크? cmp word ptr[esp+0x8],0x80 ja ABIOS_Exit //Pop Error Code add esp,4 //Previous CS from usermode? test dword ptr[esp+4],1 jnz FastExit IntReturn: pop edx pop ecx popfd jmp edx iretd
29 FastExit: test byte ptr[esp+0x9],0x1 jnz IntReturn // 클린업스택 pop edx add esp,4 and byte ptr[esp+1],0xfd popfd pop ecx jmp short $+3 mov eax,90350ffbh //sti sysexit iretd BadStack: mov ecx,fs:0x40 //KPCR_TSS mov esp,dword ptr[ecx+0x4] //KTSS_ESP0 //V86 stack push 0 push 0 push 0 push 0 push 0x23 //KGDT_R3_DATA + RPL_MASK push 0 push 0x20202 push 0x1B //KGDT_R3_CODE + RPL_MASK push 0 jmp _KiTrap6 //KiTrap06 Dr_FastCallDrSave: test dword ptr[ebp+0x70],20000 ////KTRAP_FRAME_EFLAGS,EFLAGS_V86_MASK jnz SKIP_CS_TEST3 test dword ptr[ebp+0x6c],1 ////KTRAP_FRAME_CS je DEBUG_STATUS SKIP_CS_TEST3: mov ebx,dr0 mov ecx,dr1 mov edi,dr2 mov dword ptr[ebp+0x18],ebx mov dword ptr[ebp+0x1c],ecx mov dword ptr[ebp+0x20],edi mov ebx,dr3 mov ecx,dr6
30 mov edi,dr7 mov dword ptr[ebp+0x24],ebx mov dword ptr[ebp+0x28],ecx xor ebx,ebx mov dword ptr[ebp+0x2c],edi mov DR7,ebx mov edi,dword ptr fs:0x20 mov ebx,dword ptr[edi+0x2f8] mov ecx,dword ptr[edi+0x2fc] mov DR0,ebx mov DR1,ecx mov ebx,dword ptr[edi+0x300] mov ecx,dword ptr[edi+0x304] mov DR2,ebx mov DR3,ecx mov ebx,dword ptr[edi+0x308] mov ecx,dword ptr[edi+0x30c] mov DR6,ebx mov DR7,ecx jmp DEBUG_STATUS UnexpectedRange: cmp ecx,0x10 //SERVICE_TABLE_TEST jnz InvalidCall //Setup Win32K Table push edx push ebx call PsConvertToGuiThread // 리턴코드체크 or eax,eax // 레지스터리스토어 pop eax pop edx // 트렙프레임리셋 mov ebp,esp mov [esi+0x134],ebp //KTHREAD_TRAP_FRAME // 다시콜 jz SysCallEntry // 테이블 limit 과베이스구함 lea edx, KeServiceDescriptorTable + 0x10
31 mov ecx,dword ptr[edx+0x8] //SERVICE_DESCRIPTOR_LIMIT mov edx,dword ptr[edx] //SERVICE_DESCRIPTOR_BASE // 테이블주소와인덱스값더한주소구함 lea edx,dword ptr[edx+ecx*4] and eax,0xfff //SERVICE_NUMBER_MASK add edx,eax // 리턴값구함 movsx eax,byte ptr[edx] or eax,eax jle KeReturnFromSystemCall // 잘못된서비스로리턴값넘김 mov eax, 0xC000001CL //STATUS_INVALID_SYSTEM_SERVICE jmp KeReturnFromSystemCall InvalidCall: mov eax, 0xC000001CL //STATUS_INVALID_SYSTEM_SERVICE jmp KeReturnFromSystemCall AccessViolation: // 커널모드로부터의엑세스인가? test byte ptr [ebp+0x6c],0x1 //KTRAP_FRAME_CS,MODE_MASK // 괞찮다면계속진행 je CopyParams // 실패잘못된인자 mov eax,0xc l jmp AfterSyscall FullIDTVector: test dword ptr[ebp+0x70],0x20000 //KTRAP_FRAME_EFLAGS,EFLAGS_V86_MASK jnz SkIP_CS_TEST2 test dword ptr[ebp+0x6c],0x1 je CHECK_FOR_V86 SKIP_CS_TEST2: xor ebx,ebx mov esi,dword ptr[ebp+0x18] mov edi,dword ptr[ebp+0x1c] mov DR7,ebx mov DR0,esi //KTRAP_FRAME_CS
32 mov ebx,dword ptr[ebp+0x20] mov DR1,edi mov DR2,ebx mov esi,dword ptr[ebp+0x24] mov edi,dword ptr[ebp+0x28] mov edi,dword ptr[ebp+0x2c] mov DR3,esi mov DR6,edi mov DR7,ebx jmp CHECK_FOR_V86 RestoreEAX: mov eax,[esp+0x44] //KTRAP_FRAME_EAX //skip registers add esp,0x30 //Restore segments pop gs pop es pop ds pop edx pop ecx //Jmp back to mainline jmp RestoreFS RestoreCS: mov ebx,[esp+0x10] //KTRAP_FRAME_TEMPCS mov [esp+0x6c],ebx //KTRAP_FRAME_CS mov ebx,[esp+0x14] //KTRAP_FRAME_TEMPESP sub ebx,0xc mov [esp+0x64],ebx //KTRAP_FRAME_ERROR_CODE //Copy Interrupt Stack mov esi,[esp+0x70] //KTRAP_FRAME_EFLAGS mov [ebx+8],esi mov esi,[esp+0x6c] //KTRAP_FRAME_CS mov [ebx+4],esi mov esi,[esp+0x68] //KTRAP_FRAME_EIP mov [ebx],esi // 리턴 add esp,0x54 pop edi pop esi //KTRAP_FRAME_EDI
33 pop ebx pop ebp mov esp,[esp] iretd V86_Exit: add esp,0x3c //KTRAP_FRAME_EDX //Restore pop edx pop ecx pop eax lea esp,[ebp+0x54] //KTRAP_FRAME_EDI pop edi pop esi pop ebx pop ebp cmp word ptr [esp+8],0x80 ja ABIOS_Exit SKIP_LSS: ABIOS_Exit: //skip error code add esp,4 iretd cmp word ptr[esp+0x2],0 je SKIP_LSS cmp word ptr[esp],0 jnz SKIP_LSS shr dword ptr[esp],0x10 mov word ptr[esp+0x2],0xf8 lss sp,dword ptr[esp] movzx esp,sp iretd 위의코드는 Windows XP SP2 의 KiFastCallEntry() 를 Reverse Engineering 하여만든것이기떄문에다른 Windows 에서는동작하지않을것입니다. 코드의내용중, 기존의 KiFastCallEntry() 와다른부분이있는데, 밑의코드입니다. //Blocking SSDT Hooking cmp edi,orgservicetable //edi 가 KeServiceDescriptorTable 인가? jne Shadow // 아니라면 KeServiceDescriptorShadow 로인식 mov edi,newservicetable // 프로그램내부의새 ServiceTable 을사용
34 Shadow: NotShadow: jmp NotShadow mov edi,newshadowtable //Shadow 일경우 WINAPI 에관한정보가 // 추가된 SDT 사용 위의코드를통해서프로그램내부의 ServiceTable 을사용하도록변경됨으로, SSDT Hooking 을전역적으로무력화시킬수있습니다. SYSENTER 를사용하지않는 int 0x2e 에대해서도 IDT 에 0x2e 번을다음함수의주소로수정하여처리하여줄수있습니다. declspec(naked) MyKiSystemService() asm push 0 push ebp push ebx push edi push fs mov ebx,0x30 mov fs,bx push dword ptr fs:0 mov dword ptr fs:0,-1 mov esi,dword ptr fs:0x124 push dword ptr[esi+0x140] sub esp,0x48 mov ebx,dword ptr[esp+0x6c] and ebx,0x1 mov byte ptr[esi+0x140],bl mov ebp,esp mov ebx,dword ptr[esi+0x134] mov dword ptr[ebp+0x3c],ebx mov dword ptr[esi+0x134],ebp cld mov ebx,dword ptr[ebp+0x60] mov edi,dword ptr[ebp+0x68] mov dword ptr[ebp+0xc],edx mov dword ptr[ebp+0x8],0xbadb0d00 mov dword ptr[ebp],ebx mov dword ptr[ebp+0x4],edi test byte ptr[esi+0x2c],0xff jnz DebugStatus ExitService: sti
35 jmp SyscallEntry DebugStatus: test dword ptr [ebp+0x70],0x20000 jnz SkipCheck test dword ptr [ebp+0x6c],1 je ExitService SkipCheck: mov ebx,dr0 mov ecx,dr1 mov edi,dr2 mov dword ptr [ebp+0x18],ebx mov dword ptr [ebp+0x1c],ecx mov dword ptr [ebp+0x20],edi mov ebx, DR3 mov ecx, DR6 mov edi, DR7 mov dword ptr [ebp+0x24],ebx mov dword ptr[ebp+0x28],ecx xor ebx,ebx mov dword ptr [ebp+0x2c],edi mov DR7,ebx mov edi,dword ptr fs:[0x20] mov ebx,dword ptr[edi+0x2f8] mov ecx,dword ptr[edi+0x2fc] mov DR0,ebx mov DR1,ecx mov ecx,dword ptr[edi+0x304] mov DR2,ebx mov DR3,ecx mov ebx,dword ptr[edi+0x308] mov ecx,dword ptr[edi+0x30c] mov DR6,ebx mov DR7,ecx jmp ExitService 정리 실행순서를다음과같이정리하여볼수있습니다. 1) 구현에필요한함수들의주소를구해온다. 2) 각프로세서의 MSR 에 0x176 번을새로만든함수로연결하여준다. 3) 사용자가기능중지를원할경우 MSR 의 0x176 번을기존의 KiFastCallEntry() 주소로복구시킨다. 장점시스템전역적으로 SSDT Hooking 을무력화시킬수있으며, 프로그램내부적으로는 Hooking 을사용할수있음으로, 경쟁상태에서우위를차지할수있습니다.
36 단점 0x176 번이다른프로세스에의해덮어쓰여질경우, 재기능을발휘할수없습니다. 4. 작동여부테스트 실제위에서다루었던내용들이작동하는지에대한테스트를하겠습니다. 시나리오는간단합니다. SSDT Hooking 을사용하여 notepad.exe 를숨긴후, 3 번에서다루었던무력화방법들을사용하여어떤작용을하는지보겠습니다. 후킹하는함수들은다음과같습니다.. ZwOpenProcess() ZwWriteVirtualMemory() ZwReadVirtualMemory() ZwQuerySystemInformation() 4-1. SDT-RESTORE Hooking 을하기전에는프로세스목록에서 notepad.exe 를볼수있습니다.
37 Hooking 을시작하니 Process 목록에서 notepad.exe 가사라졌습니다. SDT-RESTORE 를위와같이이용하여 SDT 들을복구시켜주었습니다. 다시 notepad.exe 를볼수있게되었습니다.
38 4-2. SDT RELOCATION Hooking 전이라 notepad.exe 를목록에서볼수있습니다. Hooking 을시작하여서 notepad.exe 가목록에서사라진것을볼수있습니다.
39 SDT RELOCATION 시키자, SSDT Hooking 여부에상관없이, notepad.exe 를프로세스목록에서다시볼수있게되었습니다 KiFastCallEntry() Imitation 현재의 KiFastCallEntry() Imitation 에는 ServiceTable 을기존시스템의것을그대로사용하고있습니다. 그럼으로현재의코드에서는 KiFastCallEntry() Imitation 을 Hooking 하는녀석보다먼저실행시켜주어야합니다. 만약 ServiceTable 을하드코딩을하거나, SDT-RESTORE 처럼재메핑하여꺠끗한 ServiceTable 을제공해준다면보다강력해질것입니다. Hooking 전이라 notepad.exe 를프로세스목록에서볼수있습니다.
40 KiFastCallEntry() Imitation 을작동시켰습니다. Hooking 중인상태이나, notepad.exe 를프로세스목록에서볼수있습니다. 위의테스트를통해 SSDT Hooking 무력화가실제로가능한것을알수있습니다. 재가다루었던이방법외에도훨씬강력한방법이존재할수있습니다. 읽고게시는분께서무언가만들고자하는의지와열정만있으시다면분명획기적인방법을고안해내실수있으리라믿습니다. 그럼이만이글을마치도록하겠습니다.
41 5. References 참고문헌 [1] Greg Hoglund, James Bulter, Rootkits : Subverting the Windows Kernel [2] 정덕영, Windows 구조와원리그리고 CODES [3] Rootkit.com - [4] 여리의홈페이지 End
Deok9_Exploit Technique
Exploit Technique CodeEngn Co-Administrator!!! and Team Sur3x5F Member Nick : Deok9 E-mail : DDeok9@gmail.com HomePage : http://deok9.sur3x5f.org Twitter :@DDeok9 > 1. Shell Code 2. Security
More informationMicrosoft Word - [Windows Hook] 6.HideProcess.doc
Hide Process Last Update : 2007 년 6 월 11 일 Written by Jerald Lee Contact Me : lucid78@gmail.com 본문서는 SSDT Hook을이용한프로세스를감추는기술에대해정리한것입니다. 제가알고있는지식이너무짧아가급적이면다음에언제보아도쉽게이해할수있도록쓸려고노력하였습니다. 기존에나와있는여러훌륭한문서들을토대로짜집기의형태로작성되었으며기술하지못한원문저자들에게매우죄송할따름입니다.
More information<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F494454486F6F6B696E672E687770>
IDT Hooking을 이용한 Simple KeyLogger 이동수 alonglog@is119.jnu.ac.kr 개 요 커널 Hooking에 관하여 공부하는 중에 IDT Hooking에 관하여 알게 되었다. 이전에 공부하 였던 SSDT Hooking과는 다른 요소가 많다. IDT Hooking을 공부하면서 컴퓨터의 인터럽트 과정을 이해할 수 있는 좋은 계기가
More informationSSDT(System Service Descriptor Table) Hooking Written by 백구 Contack Me : 목차 가. 이문서의목적... 2 나. 유저모드와커널모드... 2 다. Windows API 흐름..
SSDT(System Service Descriptor Table) Hooking Written by 백구 Contack Me : whiteexplod@naver.com 목차 가. 이문서의목적... 2 나. 유저모드와커널모드... 2 다. Windows API 흐름... 2 1. User Level... 2 2-1. 소프트웨어인터럽트 0x2E에의한커널모드짂입방식...
More informationCKKeyPro 적용가이드
3.20 사이버테러악성코드분석보고서 라온시큐어보안기술연구팀 작성일 : 2013. 03 페이지 : 1/15 Introduction 2013년 3월 20일오후, MBC, KBS, YTN, 농협, 신한은행, 제주은행전산망장애가동시에발생하였다. 피해기관들의호스트약 500여대에오류메시지가화면에나타났으며악성코드에감염된호스트는사용할수없는상태가되었다. 현재까지정확한침투경로가밝혀지지않고있다.
More informationhlogin2
0x02. Stack Corruption off-limit Kernel Stack libc Heap BSS Data Code off-limit Kernel Kernel : OS Stack libc Heap BSS Data Code Stack : libc : Heap : BSS, Data : bss Code : off-limit Kernel Kernel : OS
More informationINTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co
Basic reverse engineering on x86 This is for those who want to learn about basic reverse engineering on x86 (Feel free to use this, email me if you need a keynote version.) v0.1 SeungJin Beist Lee beist@grayhash.com
More informationNo Slide Title
Copyright, 2017 Multimedia Lab., UOS 시스템프로그래밍 (Assembly Code and Calling Convention) Seong Jong Choi chois@uos.ac.kr Multimedia Lab. Dept. of Electrical and Computer Eng. University of Seoul Seoul, Korea
More informationPoison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3
Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Example 3.1 Files 3.2 Source code 3.3 Exploit flow
More information1. Execution sequence 첫번째로 GameGuard 의실행순서는다음과같습니다 오전 10:10:03 Type : Create 오전 10:10:03 Parent ID : 0xA 오전 10:10:03 Pro
#44u61l5f GameGuard 에대한간단한분석. By Dual5651 (http://dualpage.muz.ro) 요약 : 이문서는분석자의입장에서 GameGuard의동작을모니터링한것에대한것입니다. 실제 GameGuard의동작방식과는다소차이가있을수있습니다. 이문서에등장하는모든등록상표에대한저작권은해당저작권자에게있습니다. 1. Execution sequence
More informationMicrosoft PowerPoint - o8.pptx
메모리보호 (Memory Protection) 메모리보호를위해 page table entry에 protection bit와 valid bit 추가 Protection bits read-write / read-only / executable-only 정의 page 단위의 memory protection 제공 Valid bit (or valid-invalid bit)
More information03장.스택.key
---------------- DATA STRUCTURES USING C ---------------- 03CHAPTER 1 ? (stack): (LIFO:Last-In First-Out) 2 : top : ( index -1 ),,, 3 : ( ) ( ) -> ->. ->.... 4 Stack ADT : (LIFO) : init():. is_empty():
More informationPowerPoint 프레젠테이션
Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi
More informationChapter #01 Subject
Device Driver March 24, 2004 Kim, ki-hyeon 목차 1. 인터럽트처리복습 1. 인터럽트복습 입력검출방법 인터럽트방식, 폴링 (polling) 방식 인터럽트서비스등록함수 ( 커널에등록 ) int request_irq(unsigned int irq, void(*handler)(int,void*,struct pt_regs*), unsigned
More information3.20 테러 악성코드바이너리분석 손충호 (StolenByte) WOWHACKER Group 해당문서는 WOWHACKER Group 의문서이므로, 무단도용및수 정및변조는할수없습니다. 페이지 1 / 20
3.20 테러 악성코드바이너리분석 손충호 (StolenByte) stolenbyte@wowhacker.org WOWHACKER Group 2013-03-20 해당문서는 WOWHACKER Group 의문서이므로, 무단도용및수 정및변조는할수없습니다. 페이지 1 / 20 전체적인공격프로세스 페이지 2 / 20 1. 바이너리가사용할 LoadLibrary 하여함수 Load
More information<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F F6F6B696E672E687770>
SSDT HOOKING을이용한프로세스와파일숨기기 이동수 alonglog@is119.jnu.ac.kr 개 요 기존에만들었던메시지후킹프로그램을숨겨보고싶어서 SSDT후킹을공부하였다. 그리고그결과를정리하여이문서를작성하였다. 프로세스를숨기고파일을숨기기위해서 Native API를후킹했다. 메시지후킹과다르게 SSDT후킹은커널모드에서후킹을해야하므로디바이스드라이버로프로그램이작성되어있다.
More informationMicrosoft PowerPoint - a10.ppt [호환 모드]
Structure Chapter 10: Structures t and Macros Structure 관련된변수들의그룹으로이루어진자료구조 template, pattern field structure를구성하는변수 (cf) C언어의 struct 프로그램의 structure 접근 entire structure 또는 individual fields Structure는
More informationA Hierarchical Approach to Interactive Motion Editing for Human-like Figures
단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct
More information=
written by vangelis(vangelis@wowhacker.org) 0 0000 8 1000 1 0001 9 1001 2 0010 10 1010 3 0011 11 1011 4 0100 12 1100 5 0101 13 1101 6 0110 14 1110 7 0111 15 1111 110112 + 100012 = 1011002 110 0000 0101
More informationChapter 4. LISTS
C 언어에서리스트구현 리스트의생성 struct node { int data; struct node *link; ; struct node *ptr = NULL; ptr = (struct node *) malloc(sizeof(struct node)); Self-referential structure NULL: defined in stdio.h(k&r C) or
More informationMicrosoft PowerPoint - chap06-5 [호환 모드]
2011-1 학기프로그래밍입문 (1) chapter 06-5 참고자료 변수의영역과데이터의전달 박종혁 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr h k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net 자동변수 지금까지하나의함수안에서선언한변수는자동변수이다. 사용범위는하나의함수내부이다. 생존기간은함수가호출되어실행되는동안이다.
More informationMicrosoft Word - MSOffice_WPS_analysis.doc
MS Office.WPS File Stack Overflow Exploit 분석 (http://milw0rm.com/ 에공개된 exploit 분석 ) 2008.03.03 v0.5 By Kancho ( kancholove@gmail.com, www.securityproof.net ) milw0rm.com에 2008년 2월 13일에공개된 Microsoft Office.WPS
More information슬라이드 1
-Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역
More informationAPI 매뉴얼
PCI-DIO12 API Programming (Rev 1.0) Windows, Windows2000, Windows NT and Windows XP are trademarks of Microsoft. We acknowledge that the trademarks or service names of all other organizations mentioned
More information<4D F736F F F696E74202D204B FC7C1B7CEB1D7B7A55F F6E48616E646C6572B8A6C5EBC7D1BFA1B7AFB0CBC3E2B9D7BCF6C1A
강연소개 Exception Handler 를통한에러검출및수정 디버깅을즐겨하십니까..? 에러를만나면반갑습니까..? 전화로버그보고를받았나요..? 잡히지않는버그!!!! 따분한강의 졸아도좋습니다!!!! 강연자소개 테스터 온라인게임클라이언트개발 로컬라이즈및해외지원업무 디버깅, 최적화, 호환성향상에관심 강연대상 x86 환경에서 Windows 프로그래밍 디버깅 / 에러추적은
More informationMicrosoft PowerPoint - a6.ppt [호환 모드]
이장의내용 6 장조건부처리 부울과비교명령어 조건부점프 조건부루프명령어 조건부구조 컴퓨터정보통신 어셈블리언어 2 6.2 부울과비교명령어 부울명령어 Instructions ti 동작 AND dst, src OR dst, src XOR dst, src NOT dst dst dst AND src dst dst OR src dst dst XOR src dst NOT
More informationDeok9_PE Structure
PE Structure CodeEngn Co-Administrator!!! and Team Sur3x5F Member Nick : Deok9 E-mail : DDeok9@gmail.com HomePage : http://deok9.sur3x5f.org Twitter :@DDeok9 1. PE > 1) PE? 2) PE 3) PE Utility
More informationSRC PLUS 제어기 MANUAL
,,,, DE FIN E I N T R E A L L O C E N D SU B E N D S U B M O TIO
More informationMicrosoft PowerPoint - a8a.ppt [호환 모드]
이장의내용 8 장고급프로시저 스택프레임 재귀 (Recursion) Invoke, Addr, Proc, Proto 디렉티브 다중모듈프로그램작성 2 8.2 스택프레임 Stack Frame ( 또는 activation record) procedure 의다음사항을저장한 영역 urn address passed parameter ( 스택매개변수 ) saved register
More information[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi
2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,
More informationMicrosoft Word - building the win32 shellcode 01.doc
Win32 Attack 1. Local Shellcode 작성방법 By 달고나 (Dalgona@wowhacker.org) Email: zinwon@gmail.com Abstract 이글은 MS Windows 환경에서 shellcode 를작성하는방법에대해서설명하고있다. Win32 는 *nix 환경과는사뭇다른 API 호출방식을사용하기때문에조금복잡하게둘러서 shellcode
More informationchap 5: Trees
5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경
More information02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C
02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C language Assembly code Change permissions(seteuid())
More information/* */
/*---------------------------------------------------------------------------------*/ 번역 : innovation@wowhacker.org /*---------------------------------------------------------------------------------*/
More information임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과
임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수
More information01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - PO
01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - POP; POP; POP; RET PLT & GOT Debug Proof of concept Example
More information<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>
#include "stdafx.h" #include "Huffman.h" 1 /* 비트의부분을뽑아내는함수 */ unsigned HF::bits(unsigned x, int k, int j) return (x >> k) & ~(~0
More informationReusing Dynamic Linker For Exploitation Author : Date : 2012 / 05 / 13 Contact : Facebook : fb.me/kwonpwn
Reusing Dynamic Linker For Exploitation Author : pwn3r @ B10S @WiseGuyz Date : 2012 / 05 / 13 Contact : austinkwon2@gmail.com Facebook : fb.me/kwonpwn3r Abstract 대부분의 Unix 에선공유라이브러리를메모리에로드하고프로그램과 link
More information커널모드루트킷기술 SDT 후킹의창과방패 목차 목차... 1 저작권... 1 소개... 1 연재가이드... 1 필자소개... 2 Introduction... 2 SDT 후킹... 2 SDT 복구... 6 SDT 재배치... 7 SDT를찾는또다른방법... 7 젂용 SDT.
커널모드루트킷기술 SDT 후킹의창과방패 목차 목차... 1 저작권... 1 소개... 1 연재가이드... 1 필자소개... 2 Introduction... 2 SDT 후킹... 2 SDT 복구... 6 SDT 재배치... 7 SDT를찾는또다른방법... 7 젂용 SDT... 9 인라인후킹 vs 트램펄릮... 10 후킹을넘어서... 12 극과극은통한다... 13
More information제목
Development Technology Seminar 작 성 자 : 고형호 이 메 일 : hyungho.ko@gmail.com 최초작성일 : 2007.01.19 최종작성일 : 2007.02.05 버 전 : 01.05 홈 피 : www.innosigma.com Goal Exception Handling 1. SEH vs. CEH Exception Handling
More information<4D F736F F D20B9D9C0CCB7B5B9D9C0CCB7AFBDBA5FBCF6C1A42E646F63>
Virut 바이러스공격 ASEC 분석 1 팀고흥환선임연구원 해마다접수되는악성코드의통계를보면대부분이인터넷웜또는트로이목마가대부분을차지하며, 파일에기생하는바이러스는그수가적어지는것이추세이다. 그도그럴것이최근의악성코드특징은개인의능력과시가아닌돈과연관되는악성코드작성이대부분이기때문이다. 그렇다면 Virut 바이러스가인터넷웜과트로이목마를제치고국내뿐만아니라해외에서도큰피해를입히고있는이유가무엇인지,
More informationMicrosoft Word - FunctionCall
Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack
More informationMicrosoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100
2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack
More information저자는 코드나 정보제공에 있어서의 모든 행동에 대해 책임을 지지 않습니다
Exploiting Windows Device Drivers By Piotr Bania http://pb.specialised.info "By the pricking of my thumbs, something wicked this way comes..." "Macbeth", William Shakespeare. Univ.Chosun
More informationA Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning
C Programming Practice (II) Contents 배열 문자와문자열 구조체 포인터와메모리관리 구조체 2/17 배열 (Array) (1/2) 배열 동일한자료형을가지고있으며같은이름으로참조되는변수들의집합 배열의크기는반드시상수이어야한다. type var_name[size]; 예 ) int myarray[5] 배열의원소는원소의번호를 0 부터시작하는색인을사용
More information(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -
(Asynchronous Mode) - - - ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 - UART (Univ ers al As y nchronous Receiver / T rans mitter) 8250A 8250A { COM1(3F8H). - Line Control Register
More information목 차 1. 개요 취약점분석추진배경 취약점요약 취약점정보 취약점대상시스템목록 분석 공격기법및기본개념 시나리오 공격코드
취약점분석보고서 [Aviosoft Digital TV Player Professional 1.x Stack Buffer Overflow] 2012-08-08 RedAlert Team 강동우 목 차 1. 개요... 1 1.1. 취약점분석추진배경... 1 1.2. 취약점요약... 1 1.3. 취약점정보... 1 1.4. 취약점대상시스템목록... 1 2. 분석...
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include
More informationK&R2 Reference Manual 번역본
typewriter structunion struct union if-else if if else if if else if if if if else else ; auto register static extern typedef void char short int long float double signed unsigned const volatile { } struct
More informationMicrosoft PowerPoint - chap10-함수의활용.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과
More informationOCaml
OCaml 2009.. (khheo@ropas.snu.ac.kr) 1 ML 2 ML OCaml INRIA, France SML Bell lab. & Princeton, USA nml SNU/KAIST, KOREA 3 4 (let) (* ex1.ml *) let a = 10 let add x y = x + y (* ex2.ml *) let sumofsquare
More informationMicrosoft PowerPoint - hy2-12.pptx
2.4 명령어세트 (instruction set) 명령어세트 CPU 가지원하는기계어명령어들의집합 명령어연산의종류 데이터전송 : 레지스터 / 메모리간에데이터이동 산술연산 : 덧셈, 뺄셈, 곱셈및나눗셈 논리연산 : 비트들간의 AND, OR, NOT 및 XOR 연산 입출력 (I/O) : CPU( 레지스터 ) 와외부장치들간의데이터이동 프로그램제어 : 분기, 서브루틴호출
More informationhlogin7
0x07. Return Oriented Programming ROP? , (DEP, ASLR). ROP (Return Oriented Programming) (excutable memory) rop. plt, got got overwrite RTL RTL Chain DEP, ASLR gadget Basic knowledge plt, got call function
More informationCogame 취약점 보고
Frist Version: 2006. 01. 07 Last Version: 2006. 01. 19 anesra@{null2root.org, gmail.com Table of Contents 1. 기본개념과도구...3 1.1 윈도우쉘코드... 3 1.2 윈도우메모리 LAYOUT... 4 1.3 레지스터... 4 1.4 기본어셈블리어명령어... 4 2. 쉘코드만들기...6
More information11장 포인터
Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함
More informationMicrosoft PowerPoint - chap06-2pointer.ppt
2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.
More information< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>
Chap #2 펌웨어작성을위한 C 언어 I http://www.smartdisplay.co.kr 강의계획 Chap1. 강의계획및디지털논리이론 Chap2. 펌웨어작성을위한 C 언어 I Chap3. 펌웨어작성을위한 C 언어 II Chap4. AT89S52 메모리구조 Chap5. SD-52 보드구성과코드메모리프로그래밍방법 Chap6. 어드레스디코딩 ( 매핑 ) 과어셈블리어코딩방법
More information<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>
뻔뻔한 AVR 프로그래밍 The Last(8 th ) Lecture 유명환 ( yoo@netplug.co.kr) INDEX 1 I 2 C 통신이야기 2 ATmega128 TWI(I 2 C) 구조분석 4 ATmega128 TWI(I 2 C) 실습 : AT24C16 1 I 2 C 통신이야기 I 2 C Inter IC Bus 어떤 IC들간에도공통적으로통할수있는 ex)
More information0x <main+41>: lea eax,[ebp-264] 0x f <main+47>: push eax 0x080484a0 <main+48>: call 0x804835c <strcpy> 0x080484a5 <main+53>: add esp,0x1
FTZ LEVEL11 #include #include int main( int argc, char *argv[] ) { char str[256]; setreuid( 3092, 3092 ); strcpy( str, argv[1] ); printf( str ); gdb 를이용해분석해보면 [level11@ftz level11]$
More information5.스택(강의자료).key
CHP 5: https://www.youtube.com/watch?v=ns-r91557ds ? (stack): (LIFO:Last-In First-Out):. D C B C B C B C B (element) C (top) B (bottom) (DT) : n element : create() ::=. is_empty(s) ::=. is_full(s) ::=.
More informationM C S 심 층 분 석 1 루트킷을이용하는악성코드 안철수연구소주임연구원 고흥환 1. 개요 루트킷설치는 SunOS, Unix, Linux 등의루트권한을획득하기위한해커들의가장중요한목적이기도하다. 루트킷 이라는이름의유래도바로이러한루트액세스를위한공격에서유래된것이다. 루트킷의
루트킷을이용하는악성코드 NCSC-TR050024 M C S 심 층 분 석 1 루트킷을이용하는악성코드 안철수연구소주임연구원 고흥환 1. 개요 루트킷설치는 SunOS, Unix, Linux 등의루트권한을획득하기위한해커들의가장중요한목적이기도하다. 루트킷 이라는이름의유래도바로이러한루트액세스를위한공격에서유래된것이다. 루트킷의시초를보면공격대상의시스템 ( 주로 Unix였다
More informationMicrosoft PowerPoint - ch07 - 포인터 pm0415
2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자
More informationIDA 5.x Manual 07.02.hwp
IDA 5.x Manual - Manual 01 - 영리를 목적으로 한 곳에서 배포금지 Last Update 2007. 02 이강석 / certlab@gmail.com 어셈블리어 개발자 그룹 :: 어셈러브 http://www.asmlove.co.kr - 1 - IDA Pro 는 Disassembler 프로그램입니다. 기계어로 되어있는 실행파일을 어셈블리언어
More information목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2
제 8 장. 포인터 목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2 포인터의개요 포인터란? 주소를변수로다루기위한주소변수 메모리의기억공간을변수로써사용하는것 포인터변수란데이터변수가저장되는주소의값을 변수로취급하기위한변수 C 3 포인터의개요 포인터변수및초기화 * 변수데이터의데이터형과같은데이터형을포인터 변수의데이터형으로선언 일반변수와포인터변수를구별하기위해
More information1
초보자를위한 Kernel based windows rootkit -1 부 - By Beist Security Study Group (http://beist.org) 요약 : 이문서는윈도우 2000/XP/2003 환경에서의커널루트킷에대한개요와윈도우와하드웨어간의커넥션에대해다룹니다. 그리고실습을위해커널레벨에서 CR0 레지스터를변경하여 SSDT 의 read-only
More informationuntitled
Step Motor Device Driver Embedded System Lab. II Step Motor Step Motor Step Motor source Embedded System Lab. II 2 open loop, : : Pulse, 1 Pulse,, -, 1 +5%, step Step Motor (2),, Embedded System Lab. II
More informationPowerPoint 프레젠테이션
@ Lesson 2... ( ). ( ). @ vs. logic data method variable behavior attribute method field Flow (Type), ( ) member @ () : C program Method A ( ) Method B ( ) Method C () program : Java, C++, C# data @ Program
More informationMicrosoft PowerPoint - polling.pptx
지현석 (binish@home.cnu.ac.kr) http://binish.or.kr Index 이슈화된키보드해킹 최근키보드해킹이슈의배경지식 Interrupt VS polling What is polling? Polling pseudo code Polling 을이용한키로거분석 방어기법연구 이슈화된키보드해킹 키보드해킹은연일상한가! 주식, 펀드투자의시기?! 최근키보드해킹이슈의배경지식
More informationBMP 파일 처리
BMP 파일처리 김성영교수 금오공과대학교 컴퓨터공학과 학습내용 영상반전프로그램제작 2 Inverting images out = 255 - in 3 /* 이프로그램은 8bit gray-scale 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include #include #define WIDTHBYTES(bytes)
More informationMicrosoft PowerPoint - a9.ppt [호환 모드]
9.1 이장의내용 9 장. 스트링과배열 스트링프리미티브명령어 2 차원배열 정수배열검색및정렬 컴퓨터정보통신 어셈블리언어 2 9.2 스트링프리미티브명령어 String Primitive Instructions 의동작 String Primitive Instructions Instructions 설명 동작 MOVS(B,W,D) Move string data M[EDI]
More informationuntitled
Embedded System Lab. II Embedded System Lab. II 2 RTOS Hard Real-Time vs Soft Real-Time RTOS Real-Time, Real-Time RTOS General purpose system OS H/W RTOS H/W task Hard Real-Time Real-Time System, Hard
More informationUI TASK & KEY EVENT
KEY EVENT & STATE 구현 2007. 1. 25 PLATFORM TEAM 정용학 차례 Key Event HS TASK UI TASK LONG KEY STATE 구현 소스코드및실행화면 질의응답및토의 2 KEY EVENT - HS TASK hs_task keypad_scan_keypad hs_init keypad_pass_key_code keypad_init
More informationMicrosoft Word - ExecutionStack
Lecture 15: LM code from high level language /* Simple Program */ external int get_int(); external void put_int(); int sum; clear_sum() { sum=0; int step=2; main() { register int i; static int count; clear_sum();
More informationPowerPoint 프레젠테이션
System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소
More information(Microsoft Word - \270\256\271\366\275\314 \271\370\277\252.doc)
Smashing the Signature (Korean Translation V.08-01 01) 안티바이러스의시그니쳐탐색기법을우회하기위해 PE 파일의 헤더및속성을수정하여코드섹션을암호화하는기법을소개함. Hacking Group OVERTIME MRB00 2008.09.10 Title:
More informationPowerPoint Template
BoF 원정대서비스 목차 환경구성 http://www.hackerschool.org/hs_boards/zboard.php?id=hs_notice&no=1170881885 전용게시판 http://www.hackerschool.org/hs_boards/zboard.php?id=bof_fellowship Putty War game 2 LOB 란? 해커스쿨에서제공하는
More informationMicrosoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]
Unix Process Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1 유닉스기반다중서버구현방법 클라이언트들이동시에접속할수있는서버 서비스를동시에처리할수있는서버프로세스생성을통한멀티태스킹 (Multitasking) 서버의구현 select 함수에의한멀티플렉싱 (Multiplexing)
More informationMicrosoft PowerPoint - Chapter_09.pptx
프로그래밍 1 1 Chapter 9. Structures May, 2016 Dept. of software Dankook University http://embedded.dankook.ac.kr/~baeksj 구조체의개념 (1/4) 2 (0,0) 구조체 : 다양한종류의데이터로구성된사용자정의데이터타입 복잡한자료를다루는것을편하게해줌 예 #1: 정수로이루어진 x,
More information커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서
커알못의 커널 탐방기 2015.12 이 세상의 모든 커알못을 위해서 개정 이력 버전/릴리스 0.1 작성일자 2015년 11월 30일 개요 최초 작성 0.2 2015년 12월 1일 보고서 구성 순서 변경 0.3 2015년 12월 3일 오탈자 수정 및 글자 교정 1.0 2015년 12월 7일 내용 추가 1.1 2015년 12월 10일 POC 코드 삽입 및 코드
More information0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4
Introduction to software design 2012-1 Final 2012.06.13 16:00-18:00 Student ID: Name: - 1 - 0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x
More informationPowerPoint 프레젠테이션
KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된
More informationSSDT Hooking
SSDT Hooking Last Update : 2006 년 11 월 10 일 Written by Jerald Lee Contact Me : lucid78@gmail.com 본문서는커널모드후킹기술중의하나인 SSDT 후킹에대해정리한것입니다. 제가알고있는지식이너무짧아가급적이면다음에언제봐도쉽게이해할수있을정도로쉽게쓸려고노력하였습니다. 제가작성하였던기존의 Windows
More informationGSC Incident Report-바이킹 바이러스 분석
GSC Incident Report- 바이킹바이러스분석 1. 작성일시 : 2006.10.26 20:17(GMT +09:00) 2. 작성자 : 안창용 / 바이러스분석팀 3. 바이킹바이러스에대해서바이킹바이러스는 2005 년 2 월경최초발견된후잠시주춤하다가 2005 년 5 월부터국내에서웹해킹을통한악성코드유포사례가이슈화되면서 Internet Explorer 의취약성을공격하는
More informationadfasdfasfdasfasfadf
C 4.5 Source code Pt.3 ISL / 강한솔 2019-04-10 Index Tree structure Build.h Tree.h St-thresh.h 2 Tree structure *Concpets : Node, Branch, Leaf, Subtree, Attribute, Attribute Value, Class Play, Don't Play.
More informationÀ©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾
P a 02 r t Chapter 4 TCP Chapter 5 Chapter 6 UDP Chapter 7 Chapter 8 GUI C h a p t e r 04 TCP 1 3 1 2 3 TCP TCP TCP [ 4 2] listen connect send accept recv send recv [ 4 1] PC Internet Explorer HTTP HTTP
More informationchap7.key
1 7 C 2 7.1 C (System Calls) Unix UNIX man Section 2 C. C (Library Functions) C 1975 Dennis Ritchie ANSI C Standard Library 3 (system call). 4 C?... 5 C (text file), C. (binary file). 6 C 1. : fopen( )
More informationMicrosoft PowerPoint - IOControl [호환 모드]
목차 Input/Output Control I/O Control Mechanism mmap function munmap function RAM Area Access LED Control 4 digits 7 Segment Control Text LCD Control 1 2 I/O Control Mechanism (1) I/O Control Mechanism (2)
More informationMicrosoft PowerPoint - chap02-C프로그램시작하기.pptx
#include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의
More informationUI TASK & KEY EVENT
T9 & AUTOMATA 2007. 3. 23 PLATFORM TEAM 정용학 차례 T9 개요 새로운언어 (LDB) 추가 T9 주요구조체 / 주요함수 Automata 개요 Automata 주요함수 추후세미나계획 질의응답및토의 T9 ( 2 / 30 ) T9 개요 일반적으로 cat 이라는단어를쓸려면... 기존모드 (multitap) 2,2,2, 2,8 ( 총 6번의입력
More informationHere is a "PLDWorld.com"... // EXCALIBUR... // Additional Resources // µc/os-ii... Page 1 of 23 Additional Resources: µc/os-ii Author: Source: HiTEL D
Page 1 of 23 Additional Resources: µc/os-ii Author: Source: HiTEL Digital Sig Date: 2004929 µ (1) uc/os-ii RTOS uc/os-ii EP7209 uc/os-ii, EP7209 EP7209,, CPU ARM720 Core CPU ARM7 CPU wwwnanowitcom10 '
More informationUI TASK & KEY EVENT
2007. 2. 5 PLATFORM TEAM 정용학 차례 CONTAINER & WIDGET SPECIAL WIDGET 질의응답및토의 2 Container LCD에보여지는화면한개 1개이상의 Widget을가짐 3 Container 초기화과정 ui_init UMP_F_CONTAINERMGR_Initialize UMP_H_CONTAINERMGR_Initialize
More information<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>
8주차중간고사 ( 인터럽트및 A/D 변환기문제및풀이 ) Next-Generation Networks Lab. 외부입력인터럽트예제 문제 1 포트 A 의 7-segment 에초시계를구현한다. Tact 스위치 SW3 을 CPU 보드의 PE4 에연결한다. 그리고, SW3 을누르면하강 에지에서초시계가 00 으로초기화된다. 동시에 Tact 스위치 SW4 를 CPU 보드의
More information<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>
연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.
More information슬라이드 1
/ 유닉스시스템개요 / 파일 / 프로세스 01 File Descriptor file file descriptor file type unix 에서의파일은단지바이트들의나열임 operating system 은파일에어떤포맷도부과하지않음 파일의내용은바이트단위로주소를줄수있음 file descriptor 는 0 이나양수임 file 은 open 이나 creat 로 file
More informationMicrosoft PowerPoint - windbg쉤무2(맋운톬로ífl—로엸엜Callingê·œìŁ½).pptx
본강의 PDF 는하제소프트다운로드자료실에서받아보실수있습니다 하제소프트 주식회사하제소프트 (www.hajesoft.co.kr) 강사이봉석 과정소개 윈도우응용프로그램, 윈도우서비스프로그램, 윈도우디바이스드라이버를개발하는개발자들로하여금고급디버깅기술을제공하는 윈도우디버거 (WinDBG) 사용방법을익히게하여, 고급시스템프로그래머를양성하는데있습니다 윈도우디버거 (WinDBG)
More informationLab 4. 실습문제 (Circular singly linked list)_해답.hwp
Lab 4. Circular singly-linked list 의구현 실험실습일시 : 2009. 4. 6. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 12. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Circular Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Circular
More informationT100MD+
User s Manual 100% ) ( x b a a + 1 RX+ TX+ DTR GND TX+ RX+ DTR GND RX+ TX+ DTR GND DSR RX+ TX+ DTR GND DSR [ DCE TYPE ] [ DCE TYPE ] RS232 Format Baud 1 T100MD+
More information61 62 63 64 234 235 p r i n t f ( % 5 d :, i+1); g e t s ( s t u d e n t _ n a m e [ i ] ) ; if (student_name[i][0] == \ 0 ) i = MAX; p r i n t f (\ n :\ n ); 6 1 for (i = 0; student_name[i][0]!= \ 0&&
More information프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어
개나리 연구소 C 언어 노트 (tyback.egloos.com) 프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어먹고 하더라구요. 그래서,
More informationDocsPin_Korean.pages
Unity Localize Script Service, Page 1 Unity Localize Script Service Introduction Application Game. Unity. Google Drive Unity.. Application Game. -? ( ) -? -?.. 준비사항 Google Drive. Google Drive.,.. - Google
More information