본문으로 바로가기

ASM to C with IDA - 064 (strset)

category Reversing/ASM to C 2018. 7. 18. 17:09

C300_064



C300_소스코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
 
void main(void)
{
    char string[100];
 
    puts("문자열을 입력한 후 Enter키를 치세요 !");
    puts("아무 문자도 입력하지 않으면 프로그램은 종료됩니다 !");
 
    do
    {
        gets(string);
 
        if (strlen(string== 0break;
 
        strset(stringstring[0]);
        puts(string);
 
    } while (1);
}
 
cs




IDA - Layout Graph





IDA - Text View




strset 함수

인자로 operand1, operand2를 갖는다.

operand1의 문자열을 모두 oeprand2로 치환한다.

내부적으로 oeprand1의 문자열의 길이를 구하고 operand1의 각 문자에 순서대로 접근하여 operand2로 수정한다.



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
63
#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;
    char string[100];
 
    puts(Str);
    puts(byte_403020);
 
    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;        // string의 문자열 길이
    var_14 = edx;
    
    if(edx != 0){
        eax = string;
        var_C = eax;
        ecx = var_C;
        var_18 = ecx;
        edx = 1;
        eax = edx * 0;
        ecx = string;
        var_2 = cl;
 
        while(ecx != 0){
            edx = var_C;
            if (edx != 0)
                eax = var_C;
                cl = var_2;
                [eax] = cl;
                edx = edx + 1;
                var_C = edx;
            else
                eax = string;
                puts(eax);
                ecx = 1;
        }                        
    }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_2;
    char var_8[6];
    int var_C;
    int var_10;
    int var_14;
    int var_18;
    char string[100];
 
    puts(Str);
    puts(byte_403020);
    
    do{
        gets(string);
 
        var_8 = string;
        var_10 = var_8 + 1;
 
        while(*string++ != NULL)
    
        var_14 = string - var_10;    // var_14는 string의 문자열 길이
    
        if(var_14 != NULL){
            var_18 = var_C = string;
            var_2 = *string;
        
            while(*var_C++ != 0)
                var_C = var_2;
            
            puts(string);
        }else
            break;
 
    }while(1)        
                
    return 0;
}
cs




'Reversing > ASM to C' 카테고리의 다른 글

ASM to C with IDA - 066 (strupr)  (0) 2018.07.19
ASM to C with IDA - 065 (strnset)  (0) 2018.07.19
ASM to C with IDA - 063 (strpbrk)  (0) 2018.07.18
ASM to C with IDA - 062 (strtok)  (0) 2018.07.18
ASM to C with IDA - 061 (strspn)  (0) 2018.07.17