본문으로 바로가기

ASM to C with IDA - 069 (strdup, strcpy)

category Reversing/ASM to C 2018. 7. 20. 10:01

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== 0break;
 
        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 == 0break;
    
        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+= 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 == 0break;
    
        pstr = strdup(string);
 
        string = "temp"ecx;
        string+4 = "orar";
        string+8 = "y st";
        string+= "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