본문으로 바로가기

ASM to C with IDA - 057 (strlen)

category Reversing/ASM to C 2018. 7. 16. 11:53

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