C300_057
C300_소스코드
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> #include <string.h> void main(void) {     char string[200];     printf("문장을 입력한 후, Enter 키를 치세요 !\n");     printf("아무것도 입력하지 않으면 프로그램은 종료됩니다 !\n");     do     {         gets(string);         if (strlen(string) == 0)         {             break;         }         printf("문자열의 길이는 %d입니다. \n", strlen(string));     } while (1); } | cs | 
IDA - Layout Graph
IDA - Text View
strlen을 구현하는 코드이다.
우선 문자열이 NULL 문자까지 읽어들이면서 주소값을 1씩 증가시킨다.
문자열이 NULL을 만나면 원래의 주소에서 NULL을 만난 주소를 빼서 문자열의 길이를 구한다.
pseudo code - 의사코드
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <stdio.h> void main(void) {     char var_1;     char var_2;     char var_8[6];     int var_C;     int var_10;     int var_14;     int var_18;     int var_1C;     char string[100];     printf(_Format);     printf(byte_40303C);     while(1){         eax = string;         gets(eax);         ecx = string;         var_8 = ecx;         edx = var_8;         edx = edx + 1;         var_10 = edx;         do{             eax = var_8;             cl = [eax];             var_1 = cl;             var_8 = var_8 + 1;         }while(var_1 != NULL)         edx = var_8;         edx = edx - var_10;         var_14 = edx;         eax = string;         var_C = eax;         ecx = var_C;         ecx = ecx + 1;         var_18 = ecx;         do{             edx = var_C;             al = [edx];             var_2 = al;             var_C = var_C + 1;         }while(var_2 != NULL)         ecx = var_C;         ecx = ecx - var_18;         var_1C = ecx;         edx = var_1C;         printf(_Format, edx);     }     eax = 0; } | cs | 
pseudo code - 최종 의사코드
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include <stdio.h> void main(void) {     char var_1;     char var_2;     char var_8[6];     int var_C;     int var_10;     int var_14;     int var_18;     int var_1C;     char string[100];     printf(_Format);     printf(byte_40303C);     while(1){         gets(string);         var_8 = string;         var_10 = string + 1;         while(*string++ != NULL)         var_14 = var_8 - var_10;    // var_14에 string의 길이가 저장된다.         if(var_14 == 0)             break;         else{             var_C = string;             var_18 = string + 1;             while(*string++ != NULL);             var_1C = var_C - var_18        // var_1C에 string의 길이가 저장된다.             printf(_Format, var_1C);         }     }     return 0; } | cs | 
'Reversing > ASM to C' 카테고리의 다른 글
| ASM to C with IDA - 059 (strchr) (0) | 2018.07.17 | 
|---|---|
| ASM to C with IDA - 058 (strstr) (0) | 2018.07.16 | 
| ASM to C with IDA - 056 (strcat) (0) | 2018.07.16 | 
| ASM to C with IDA - 055 (strncmp) (0) | 2018.07.12 | 
| ASM to C with IDA - 054 (strcmp) (0) | 2018.07.12 |