본문으로 바로가기

ASM to C with IDA - 054 (strcmp)

category Reversing/ASM to C 2018. 7. 12. 11:38

C300_054



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
#include <stdio.h>
#include <string.h>
 
#define SKY    "sky"
 
void main(void)
{
    char string[100];
    int ret;
 
    printf("영단어를 입력한 후 Enter키를 치세요 !\n");
    printf("sky를 입력하면 프로그램이 종료됩니다. \n");
 
    do
    {
        gets(string);
 
        ret = strcmp(string, SKY);
 
        if (ret == 0)
        {
            printf("%s == %s, ret = %d \n"string, SKY, ret);
            break;
        }
        else if (ret < 0printf("%s < %s, ret = %d \n"string, SKY, ret);
        else printf("%s > %s, ret = %d \n"string, SKY, ret);
 
    } while (1);
}
cs



IDA - Layout Graph




IDA - Text View



sbb operand1 operand2 : operand1 = operand1 - (operand1 +Carry Flag)


CF가 1이면 -1이 된다.

or -1, 1 명령을 수행하면 -1이 된다.

CF가 0이면 0이 된다.

or 0, 1 명령을 수행하면 1이 된다.


cmp 명령어를 만날 대 ZF, CF가 설정된다.


따라서 위 과정에 따라서 strcmp의 parameter가 다를 때 반환 값이 -1이 나오거나, 1이 나온다.


strcmp를 사용할 때 C언어에서는 #include <string.h>를 이용해 간단히 사용했지만,

디스어셈블하면, 어셈블리로 strcmp가 변형되어서 해석하기 힘들었다.



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
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include <string.h>
 
void main(void)
{
    char var_1;
    char var_2;
    int ret;
    int var_c;
    int var_10;
    int var_14;
    int var_18;
    char string[100];
 
    printf(_Format);
    printf(aSky_3);
 
    do{
        eax = string;
        gets(eax);
 
        var_10 = offset aSky_2;
        ecx = string;
        var_C = ecx;
 
        edx = var_C;
        al = [edx];
        var_1 = al;
        ecx = var_10;
    
        do{    if(al == [ecx]){
        if(var_1 != NULL){
            edx = var_C    
            al = [edx+1];
            var_2 = al;
            ecx = var_10;
            if(al == [ecx+1]){
                var_C = var_C + 2;
                var_10 = var_10 + 2;
            }else
                    var_14 = edx;    
        }else
            var_14 = NULL;            
    }while(var_2 != NULL)
 
 
        eax = var_14;
        var_18 = eax;
        ecx = var_18;
        ret = ecx;
    
        if(ret == NULL)
            edx = ret
            eax = string;
            printf(aSSRetD, eax, aSky, edx);
            break;    
        else if(ret < 0)
            ecx = ret;
            edx = string;
            printf(aSSRetD_0, edx, aSky_0, ecx);
        else
            edx = ret;
            ecx = string;
            printf(aSSRetD_1, ecx, aSky_1, eax);
 
        edx = 1;
 
    }while(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
#include <stdio.h>
#include <string.h>
 
void main(void)
{
    int *ret;
    char string[100];
 
    printf(_Format);
    printf(aSky_3);
 
    do{
        gets(string);
    
        ret = strcmp(string"sky")
        
        if(ret == NULL)
            printf(aSSRetD, string, aSky, ret);
            break;    
        else if(ret < 0)
            printf(aSSRetD_0, string, aSky_0, ret);
        else
            printf(aSSRetD_1, string, aSky_1, ret);
    }while(1)
    
    return 0;
}
 
cs





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

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 - 053  (0) 2018.07.12
ASM to C with IDA - 052 (strcpy)  (0) 2018.07.11
ASM to C with IDA - 051  (0) 2018.07.11