[어셈블리어] CMP 명령어 종류 CMPoperand 를 비교(묵시적 마이너스 연산)첫번째 operand 에서 두번째 operand 값을 뺀다.결과 = 상태레지스터operand에 영향 없음. CMP reg, reg ex) CMP EAX, EBX CMP mem, reg ex) CMP [EBP-0x04], EAX CMP reg, mem ex) CMP EAX, [EBP-0x04] CMP reg, imm ex) CMP EAX , 0x02 CMP mem, imm ex) [EBP-0x04], 0x05 CMP 연산 결과 ZF(Zero Flag) CF (Carry Flag) dest sourcea > b 0 0 dest == sourcea == b 1 0 a가 b 보다 작다..
어셈블리어 명령어(Opcode) INCoperand 값이 1 증가 INC reg ex) INC EAX INC mem ex) INC [EBP-0x04] DECoperand 값이 1 감소 DEC reg ex) DEC EAX DEC mem ex) DEC [EBP-0x04] ADD(a+=b 와 동일)두 operand 값을 더해첫번째 operand 값에 저장.-첫번째 operand 에 상수가 올 수 없음 ADD reg, reg ex) ADD EAX, EBX ADD mem, reg ex) ADD [EBP-0x04] EAX ADD reg, mem ex) ADD EBX, [EBP-0x08] ADD reg, imm ex) add ECX, 0x05 ADD mem, imm ex) ADD [EBP-0x04], 0x04 SUB..
어셈블리 언어 명령어와 Operand 표시기호설명 mem메모리 label지정된 레이블 imm즉시 값(상수) reg 범용 레지스터 label = JMP 사용시 위치값 필요.INC = 인크리먼트 ( Operand 값을 1만큼 증가 ) [] 대괄호는 C언어에서 역참조(*)와 같은 역할.C언어에서 PTR을 안써주면 컴파일할때 1byte만 읽는다.ex) DWORD PTR[EBP-4] : EBP-4 부터 DWORD만큼 역참조해서 읽겠다. 인라인어셈상위레벨언어에서(C언어) 어셈블리언어를 사용할때 사용.상위레벨언어의 변수를 사용 가능하다.ex) int main(){ int a=0; _asm { INC a INC a } //
레지스터란? 레지스터 : CPU 내부에 있는 저장공간 *프로그램 실행 과정1.보조기억장치인 하드디스크에 실행파일 보관2.주기억장치인 RAM에 실행파일을 복사함.3. RAM에 데이터를 중앙처리장치인 CPU 레지스터를 이용하여 복사해와서 처리. 32bit General-purpose Resgisters(32bit 범용 레지스터)이름 명칭 해당 레지스터만의 기능 EAX 누산기 함수의 리턴값을 저장 (EDX와 같이쓸땐 하위 4byte) EBX 간접주소 지정자 간접 주소 지정. ECX 반복카운터 0과 같을때까지 하나씩 감소시키면서 반복한다.ECX값이 감소하면서 0이 될때까지 반복함.0 < ECX 0 < 3 0 < 20 < 10 < 0 EDX EAX 보조 4byte 이상의 값을 EAX와 나눠서 해결.(상위4byte..
리버스 엔지니어링 ( 역 + 공학 ) 어셈블리어 언어기계어와 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 = ..