728x90

System Hacking/windows 5

VirtualProtect

4개의 인자를 가지고, 특정 메모리 영역의 실행 권한을 변경해주는 함수이다.BOOL WINAPI VirtualProtect ( _In_ LPVOID lpaddress, # 권한을 변경할 메모리 영역의 시작 주소 _In _SIZE_T dwSize, # 변경할 크기 _In_ flNewProtect, # 변경할 속성 값 _Out_ PDWORD lpflOldProtect, # 이전 값 저장 (쓰기 가능한 영역)); 간단한 예제 코드#include #include int main() { DWORD old; unsigned char code[] = { 1, 2, 3, 4 }; VirtualProtect(code, sizeof(code), PAGE_EXECUTE_READWRITE, &old); pri..

VirtualAlloc

DEP(Data Execution Prevention)실행 권한이 없는 메모리 영역에 있는 코드가 실해오디지 못하도록 방지하는 기법—> DEP가 적용되기 시작하면서 스택 혹은 힙 영역에 쉘코드를 입력한 뒤 해당 쉘코드를 실행하도록 못하게 되었다. DEP에는 H/W 기반 DEP와 S/W 기반 DEP가 존재한다.하드웨어 DEP : 메모리에 명시적으로 실행 코드가 포함되어 있는 경우를 제외하고 프로세스의 모든 메모리 위치에서 실행할 수 없도록 표시한다.-> 대부분의 최신 프로세서는 하드웨어 적용 DEP를 지원한다.소프트웨어 DEP : CPU가 하드웨어 DEP를 지원하지 않을 경우 사용한다. 그러면, 공격자가 Heap, Stack 영역에 shellcode를 저장하고, shellcode를 실행하기 위해서는 해당 ..

[Windows] Function Pointer Overwrite

static char log_buf[500] = {0,};static int (* log_func)(void) = NULL;strcpy(log_buf, buf);log_func();static 변수를 사용하면 메모리의 data 섹션에 변수가 할당된다. data 섹션은 힙 메모리와 마찬가지로 순차적으로 사용되고 data 섹션 공격 기법도 힙과 거의 동일하다. 버퍼에 500바이트 이상의 문자열이 입력되면 strcpy가 할당된 버퍼를 모두 채운 후 추가적으로 메모리들을 덮어쓰게 할 것이다. 스택과 같이 EBP, RET가 존재하지 않으므로 덮어쓴다 해서 무조건 공격에 성공하는 것은 아니지만 이와 같이 함수 포인터를 덮어쓸 수 있을 경우, 기존의 포인터가 가리키고 있던 주소 값을 원하는 주소로 변경할 수 있다.쉘..

[Windows] Heap Overflow

힙 메모리는 스택과 다르게 RET, SEH가 존재하지 않으므로 공격을 성공시키기 위해 여러가지 다양한 기법들이 동원됩니다.주로 힙 메모리에 존재하는 다른 오브젝트, 포인터 및 헤더 등을 덮어쓰는 방법으로 공격합니다. 예제 코드#include #include #include int main() { char* buf1 = (char*)malloc(0x20); char* buf2 = (char*)malloc(0x20); printf("buf1: %p\n", buf1); printf("buf2: %p\n", buf2); memset(buf1, 'A', 0x30); free(buf1); free(buf2); return 0;}32바이트로 동적할당을 합니다.그리고 memset의 buf1의 48바이트를 채워서 buf..

[Windows] Stack Buffer Overflow

1) Stack Buffer Overflow메모리 경계를 검사하지 않는 함수 사용으로 인해 스택을 덮어쓰게 되어 주로 발생한다. 아주 고전적인 취약점이지만 아직도 많이 발생하고 있으며 실제로 퍼징을 하다 보면 여전히 많이 발견된느 취약점이다.함수는 각각의 스택 프레임을 가지고, 함수 호출 시 저장된 SFP(Saved Frame Pointer), RET(Return address)를 이용하여 호출 이전의 코드로 돌아간다. 실습 소스코드#include #include #include int main(int argc, char* argv[]){ char readbuf[2000] = { 0, }; char printbuf[500] = { 0, }; printf(" # text reader #\n"); if (a..

728x90