리버스 엔지니어링 ( 역 + 공학 ) 어셈블리어 언어기계어와 1:1 로 대응 관계를 맺고 있는 언어. 저급언어: 기계어와 가까운 언어.(어셈블리어)고급언어: 사람과 가까운 언어.(C,C++,JAVA, 스크립트) ※ 리버스 엔지니어링의 좋은 예-악성코드 분석, 패치, 오류확인※ 리버스 엔지니어링의 안좋은 예-프로그램 크랙, 인증크랙,악성코드 추가 및 배포. 바이너리 디버거 프로그램기능 : 기계어를 어셈블리어로 치환해준다.(디스어셈블리)종류 : OllyDBG, IDA Pro, WinDBG OllyDBG- 다운로드 : http://ollydbg.de특징 : 동적분석, 한줄한줄 실행하면서 분석해준다.단점 : 악성코드 실행시 하드가 위험. IDA Pro- 다운로드 : http://hex-rays.com/idapr..
스테가노그래피 (steganography) 데이터 은닉 기술.이미지 파일안에 다른 데이터를 숨길 수 있다. 만들어본 추출 소스. #includeint main(){int buffer;int hab=0;FILE* fr = fopen("c:\\HidenFile.bmp","rb"); // 파일이 숨겨져있는 이미지 경로FILE* fw = fopen("c:\\data.exe","wb"); // 숨겨진 파일 저장할 경로int i=0;fseek(fr,54,SEEK_SET); //54 byte 부터 확인(시작할 파일위치 지시자 설정)while(1){i=0; hab=0;while(i
메모리 공간에 할당되는 지역변수와 전역변수. 지역변수 : 함수 내부에서 할당되는 변수는 지역변수로써 메모리 stack 영역에 할당된다. main 함수도 함수이기 때문에 지역변수로 지정된다. 초기값은 쓰레기값이기 때문에 초기화 되어있지 않는다. 함수가 종료되면 지정한 값은 해제된다.(값의 내용은 남아있음) 전역변수 : 함수 외부에서 선언되어 어떤 함수에서든 사용가능한 변수. 컴파일시 기억장소가 할당되어 프로그램 실행부터 종료까지 Data 영역에 존재하고 자동으로 0 으로 초기화한다. Data 영역에는 읽기만 가능한 영역이 있고 읽기/쓰기 가 가능한 영역이 있다. 함수 외부에 있는 변수는 W/R 가능. 함수 안에 선언부에 있는 초기 문자열 지정한 값은 read 만 가능하다.( 이 문자열도 data영역에 들어..
rand 에 포함되어 있음. 원형 : int rand(void); 함수 리턴값 : int 형으로 값을 리턴. *0~32767 의 범위 중 무작위 수를 추출하여 값을 리턴해줌. seed 값에 따라 발생하는 난수의 값이 결정됨. 컴퓨터는 100% 임의 수가 없음. ex) int a=0; a= rand(); printf("%d \n", a); 출력값 : 41 seed값이 변경되지 않으면 실행할때마다 seed값이 고정이기 때문에 첫번째 난수는 항상 41이 출력된다. 제대로 난수를 정하고 싶다면 seed 값을 랜덤하게 넣어줘야 한다. srand 함수 에 포함되어 있음. 원형: void srand(unsigned int seed); (양수를 입력하면 seed 값을 변경해줌.) 난수에 발생되는 seed 값을 지정해줌..
제어문 break (반복문을 빠져나가는 기능, 반복을 빠져나갈 탈출조건을 만들때 사용한다.) 사용방법 : int main(){int a =1;while(a){printf("%d \n", a ) ;if(a>10){break; // if 조건문이 참이면 while 반복문 빠져나감.}a++;}return 0;} ※해당하는 반복문 한개만 빠져나간다. continue (실행되는 순간 자신이 속해있는 반복문 조건을 실행하러 감.) int main(){int a =1;while(a) // 20){print("break\n") ;break;}if(a>10){a++;printf("continue! \n") ;continue; //반복문 확인하러 이동}printf("a = %d \n ", a++);}return 0;}
제어문. 반복제어문. while (~동안) 사용방법 : while(조건문) { 실행문 } 조건이 참이면 실행문 실행후 다시 조건을 확인하고 실행문 실행 반복. do while ( 일단 한번 실행하고 조건이 참일때가지 반복) 사용방법: do { 실행문 } while(조건문); ※조건이 거짓이여도 일단 한번 실행하는 차이점. for (돌아가는 순서로 반복문 실행) 사용방법: for ( 초기값지정; 조건문; 증감식) { 실행문 } 실행 순서 1.최초 초기값을 지정 후 2. 조건문이 확인 후 3. 조건문이 참이면 실행문 실행. 4. 증감식 실행. 5. 조건문 다시 확인. 6. 다시 확인한 조건문이 참이면 실행문 실행. 7. 증감식 실행. (조건이 계속 참일때까지 위에 반복) ex) int i=0; for(i=0..
sizeof 연산자 메모리에 할당된 크기를 돌려받는 연산.(byte 크기로 돌려받음) sizeof( 변수명 ) sizeof( 자료형 ) sizeof( 배열명 ) sizeof( 구조체 ) sizeof( 상수 ) . . . #include int main(){ int a = 0; int array[12]; printf(" int : %d \n",sizeof(int)); printf(" char : %d \n",sizeof(char)); printf(" a : %d \n",sizeof(a)); printf(" array : %d \n",sizeof(array)); return 0; } 소스 출력 결과 int : 4 char : 1 a : 4 array : 48 array[12] 는 int 형식이기 때문에 4b..
캐스팅 연산자 특징 : 단항연산자, 일시적으로 자료형을 변경해준다.(일시적일뿐 사용변수의 해당 자료형은 변경되지 않는다.) 사용방식 :(datatype) int a = 97 ; printf(" %c \n", (char)a ) ; #include int main(){ int a = 10; float b = 3.14; double c = 99.9; printf(" a + b = %d \n ", a + b); printf(" b + c = %d \n ", b + c); printf(" a + b = %d \n ", a + (int)b); // int로 변경시 소수점 밑은 전부 버림. printf(" b + c = %c \n ",(char)(b + c)); return 0 ; } 소스 출력 결과 a + b = ..
증감 연산자 ++ , -- 저장공간의 값을 1증가(++), 1감소 (--) #include int main(){ int a = 10 ; int b = 20 ; printf(" a = %d \n", a ) ; printf(" a++ = %d \n", a++) ; //후위 연산자 (사용후 다음실행부터 증가) printf(" ++b = %d \n", ++b ) ; // 전위 연산자 (증가 후 바로 사용) return 0 ; } ★ 증감 연산자는 저장공간의 값만 증가 또는 감소 시킬 수 있다. 포인터변수의 주소값은 연산할 수 있지만 (주소를 담지만 변수선언했기 때문에 저장공간임) 배열의 주소이름을 연산할 수는 없다. (변수가 아니기 때문) 소스 출력 결과 a = 10 a++ = 10 ++b = 21
#include int main(){ int a = 0;//거짓 int b = 1;// 참 int c = -1;//참 printf("a || b 의 결과 : %d \n", a || b);//논리합(a또는b) OR printf("b || c 의 결과 : %d \n", b || c); printf("a && b 의 결과 : %d \n", a && b);//논리곱(a그리고b) AND printf("b && c 의 결과 : %d \n", b && c); printf("!a 의 결과 : %d \n", !a);//부정(a의 부정) NOT printf("!b 의 결과 : %d \n", !b); //!a
#include int main(){ int a = 6 ; int b = 4 ; printf("a b); // a가 b보다 큰가? printf("a == b 의 결과 : %d \n", a == b); // a와 b가 같은가? printf("a != b 의 결과 :%d \n", a != b); // a와 b가 다른가? return 0; } 관계연산자 비교 기준은 왼쪽이 기준. ( a ) 컴퓨터는 왼쪽기준으로 비교함. C언어세 말하는 '참'은 0 이 아닌 모든 수를 참으로 인정함. -1 참. -1000 참. 10000000 참 243589792 참. 0 거짓 관계 연산자는 비교 ..
1.표준 출력함수 함수 : int printf(const char*format , . . .); 기능 : 입력된 인자값을 출력하는 함수. 표준 입출력 헤더파일을 추가해야 사용 가능. #include int main(){ int num1 = 10; int num2 = 20; printf("Hello~!"); prinft("world!" printf("num 1 = %d \n",num1); printf("num 2 = %d \n", num2); printf("num1= %d , num2= %d \n", num1, num2); return 0; } %d : 10진수 형태로 뒤에 인자값을 출력. 인자값은 콤마(,) 로 구문하고 printf() 함수안에 인자값은 첫번째만 문자열, 두번째부터는 인자값을 계속 넣을 ..