C300_069
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 25 26 27 28 29 30 | #include <stdio.h> #include <string.h> #include <malloc.h> void main(void) { char string[100]; char *pstr; puts("문자열을 입력한 후 Enter키를 치세요 !"); puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다 !"); do { gets(string); if (strlen(string) == 0) break; pstr = strdup(string); strcpy(string, "temporary string"); printf("문자열 string : %s \n", string); printf("문자열 pstr : %s \n", pstr); free(pstr); } while (1); } | cs |
IDA - Layout Graph
IDA - Text View
strdup 함수: char *strdup(const char *string);
strdup는 string을 복사하고 복사한 문자열의 포인터를 반환하는 함수이다.
문자를 복사하기 위해서 strdup함수가 호출되면 내부적으로 string의 길이를 알아낸 후 malloc() 을 호출한다.
따라서 free()를 이용해 메모리 할당 해제를 해야한다.
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 61 62 | #include <stdio.h> void main( void ) { char var_1; char var_8[7]; char *pstr; int var_10; int var_14; char string[100]; puts(Str); puts(byte_403064); do{ eax = string; gets(eax); ecx = string; var_8 = ecx; edx = var_8; edx = edx + 1; var_C = 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_C; var_10 = edx; //var_10에 string의 길이가 저장됨. if(var_10 == 0) break; eax = string; strdup(eax); pstr = eax; ecx = dword_403050; // temp string = ecx; edx = dword_403045 // orar string+4 = edx; eax = dword_403058; // y st string+8 = eax; ecx = dword_40305C; // ring string+C = ecx; dl = byte_403060; // NULL eax = string; // temporary stirngNULL printf(_Format, eax); ecx = pstr; printf(_Format, ecx); edx = pstr; free(edx); }while(1) 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 | #include <stdio.h> void main( void ) { char var_1; char var_8[7]; int var_C; int var_10; char string[100]; puts(Str); puts(byte_403020); do{ gets(string); var_8 = string; var_C = string + 1; while(*var_8++ != NULL); var_10 = var_8 - var_C; //var_10에 string의 길이가 저장됨. if(var_10 == 0) break; pstr = strdup(string); string = "temp"ecx; string+4 = "orar"; string+8 = "y st"; string+C = "ring"; string+10 = NULL; // NULL printf(_Format, string); printf(_Format, pstr); free(pstr); }while(1) return 0; } | cs |
'Reversing > ASM to C' 카테고리의 다른 글
ASM to C with IDA - 070 (0) | 2018.07.20 |
---|---|
ASM to C with IDA - 068 (strrev) (0) | 2018.07.20 |
ASM to C with IDA - 067 (strlwr) (0) | 2018.07.19 |
ASM to C with IDA - 066 (strupr) (0) | 2018.07.19 |
ASM to C with IDA - 065 (strnset) (0) | 2018.07.19 |