본문 바로가기

컴퓨터

범용 쉘코드(Universal Shellcode) (1) 이 포스팅은 서적 '윈도우 시스템 해킹 가이드 : 버그헌팅과 익스플로잇'을 기반으로 작성한 포스팅입니다. 현 포스팅[범용 쉘코드(Universal Shellcode)]을 읽기에 앞서 제시된 포스팅을 읽고 오시는 것을 추천드립니다. 이전 포스팅쉘코드(Shellcode) 기초(1)쉘코드(Shellcode) 기초(2) 범용 쉘코드(Universal Shellcode)의 필요성 이전 포스팅[ 쉘코드(Shellcode) 기초(1) ]에서 작성한 쉘코드를 컴퓨터를 재부팅한 후 실행하면 어떻게 될까? 다음과 같은 에러 메세지를 확인할 수 있다. 그렇다면 다음과 같이 재부팅전에 정상작동하던 쉘코드가 어떠한 부분에서 문제가 발생하며 어떠한 이유로 정상적으로 실행이 되지 않는 것인지 짚고 넘어가야 한다. 위의 작성한 쉘코.. 더보기
쉘코드(Shellcode) 기초(2) 이 포스팅은 서적 '윈도우 시스템 해킹 가이드 : 버그헌팅과 익스플로잇'을 기반으로 작성한 포스팅입니다. 이전 포스팅쉘코드(Shellcode) 기초(1) 보러가기 쉘코드(Shellcode) 기초(1)에서의 문제점 이전 포스팅[쉘코드(Shellcode) 기초(1)]에서 작성한 쉘 바이트 코드에서는 널바이트('0x00')을 포함한다는 문제점을 지니고 있었다. 바이트 코드에서 널바이트('0x00')를 포함할 시에 문자열 복사 계열 취약점에서 발생하는 부분에서는 바이트 코드로 사용할 수 없다는 문제점(범용성)과 이로인해 널바이트 코드 이후에 쉘 바이트 코드를 복사하지않아 정상적으로 작동하지 않는다는 문제점(신뢰성)을 지니고 있다. 결론적으로 공격자(해커)는 쉘바이트 코드에서 널바이트만을 제거하여 같은 동작을 하.. 더보기
쉘코드(Shellcode) 기초(1) 이 포스팅은 서적 '윈도우 시스템 해킹 가이드 : 버그헌팅과 익스플로잇'을 기반으로 작성한 포스팅입니다. 쉘코드(Shellcode) 쉘코드란 보안 취약점이 있는(실행흐름을 악의적으로 조작할 수 있는) 프로그램에서 실행 시킬 실질적인 실행 코드를 말한다.예를들어 이는 포트를 여는 것 일 수도 있고, 악의적인 서버에 본인의 개인정보 파일을 업로드하게 하는 것 일 수 도있으며,해커가 원하는 실질적인 모든 행동을 수행하는 코드를 말한다. 보안 취약점이 있는 프로그램의 공격에 성공하여 실행흐름을 조작하여 공격자가 원하는 특정주소를 실행시킬 수 있는 데 이때 CPU는 흐름이 바뀐 메모리에서 직접 코드를 읽기에 CPU가 해석할 수 있는 기계어 코드로 이뤄져야한다. 좋은 쉘코드의 조건신뢰성 - 공격자가 원하는 행위를 .. 더보기
관망해석 프로그램 Hardy-Cross 관망 계산법 Hardy-Cross 관망 계산법을 이용한 프로그램을 만들어봤다. 단순한 재미로 만들었기에 폐합회로가 1개인 경우에 해당하며 무수한 노가다를 방지하기위해 오차범위를 0.001%이 내일 경우 반복문을 종료하는 형태로 프로그램을 만들었다. 더보기
메모리의 동적 할당 ◇ 메모리의 동적 할당 함수의 반환형은 void형 포인터고 인자는 정수가 들어간다. 예시로 int main(void){void * ptr1 = malloc(4); // 4바이트가 힙 영역에 할당void * ptr2 = malloc(12); // 12바이트가 힙 영역에 할당 . . . . free(ptr1); // ptr1이 가리키는 4바이트 메모리 공간 해제free(ptr2); // ptr2이 가리키는 4바이트 메모리 공간 해제 . . . . } 다음과 같은 소스코드에서 malloc함수의 활용을 확인해보자. malloc(4);malloc(12); 함수는 힙 영역위의 메모리 공간에 4바이트 만큼의 공간을 확보하고 확보된 메모리 공간의 주소값을 반환한다. 힙 영역위의 메모리 공간에 12바이트 만큼의 공간을 .. 더보기
함수 포인터 ◇ 함수 포인터의 이해 변수만 메모리 공간에 저장되는 것이 아니다. 프로그램의 실행의 흐름을 구성하는 함수들도 바이너리 형태로 메모리 공간에 저장되어서 호출 시 실행이된다. 이렇게 메모리상에 저장된 함수의 주소 값을 저장하는 포인터 변수가 '함수 포인터 변수'이다. 배열의 이름이 배열의 시작 주소값을 의미하듯, 함수의 이름도 함수가 저장된 메모리 공간의 주소값을 의미한다. 이러한 함수의 주소 값 저장을 위한 포인터 변수를 별도로 선언할 수 있으며, 이러한 용도로 선언된 포인터 변수를 가리켜 '함수 포인터 변수'라 한다. ◇ 함수 포인터 변수의 선언 함수 int SimpleFunc(int num) { . . . . } 위 함수의 반환형과 매개변수 선언은 각각 다음과 같다. · 반환형 int · 매개변수 선.. 더보기
두 가지 형태의 문자열 표현 ◇ 두 가지 형태의 문자열 표현 char str1[ ] = "My String"; char *str2 = "Your String"; str1은 그 자체로 문자열 전체를 저장하는 배열 str2는 메모리상에 "Your String"을 저장하고 첫번째 문자를 가리키는 포인터 변수이다. 배열이름 str1은 계속해서 문자 M이 저장된 위치를 가리키는 상태이어야 하지만 포인터 변수 str2는 다른위치를 가리킬수 있다. ◇ 두 가지 형태의 문자열 표현의 예시 #include int main (void) { char str1[ ] = "My String"; //변수 형태의 문자열 char *str2 = "Your String"; //상수 형태의 문자열 printf("%s %s \n", str1, str2); str2 .. 더보기
컴퓨터 프로그래밍 설계 과제#2_HW03 #include #include #include #include int main(void){ int i = 0; int j = 0; //실행횟수에 관한 변수 int hit = 0; double probability = 0.0; int flag = 0; //이중루프 탈출을 위한 플래그 char input_char; while(1){ srand((unsigned int)time(NULL)); //Seed를 집어넣음 몇번째 숫자열을 쓸지 srand(양수) printf("Enter a trial number (1 ~ 10000) : "); scanf("%d", &j); fflush(stdin); //버퍼 비우기 printf("\n"); //문제 조건(2)에 의한 개행 if(j 더보기