반응형

str_func.exe
0.05MB

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (int argc, char **argv)
{
    char * src = "ForExample";
    char * dst = (char *)malloc(30 *sizeof(char));
    int count = 0;

    printf("Input the Password : ");
    fgets(dst, 30, stdin);
    dst[strlen(dst)-1] = '\\0';

    if(strlen(dst) != strlen(src))
    {
        printf("length Not Match!!!\\n");
        exit(0);
    }
    else
    {
        if(!strcmp(dst, src))
        {
            printf("Good\\n");
            exit(0);
        }
        else
        {
            printf("Not Match!!!\\n");
            exit(0);
        }
    }
    
    return 0;
}

 

위 코드는 비교할 패스워드를 위한 메모리 공간을 할당 후 입력된 값의 길이를 비교하여 맞으면 입력된 값과 실제 패스워드의 문자열을 비교하는 프로그램이다.

 


 

위의 부분이 main() 함수 부분이다.

 


strlen()

if(strlen(dst) != strlen(src))
    {
        printf("length Not Match!!!\\n");
        exit(0);
    }
    else
    {
        if(!strcmp(dst, src))
        {
            printf("Good\\n");
            exit(0);
        }
        else
        {
            printf("Not Match!!!\\n");
            exit(0);
        }
    }

 

위 어셈블리어 부분이 위의 코드 부분이다.

 

4015F3 주소에서 입력된 패스워드 문자열의 길이와 비교할 문자의 길이를 비교해서 같을 경우 40160B로 점프하여 입력한 문자와 비교할 문자가 같은지 비교하고, 같지 않을 경우 4015F5 주소로 가서 length Not Match!!! 메시지를 출력한다.

 

또한 40160B 주소로 점프하여 입력한 문자와 비교할 문자가 같은지 비교하여 같으면 40161F 주소의 루틴이 실행되어 “Good”이 출력되고, 같지 않으면 401635 주소의 루틴이 실행되어 “Not Match!!!”이 출력된다.

 

if(strlen(dst) != strlen(src))
{
    printf("length Not Match!!!\\n");
    exit(0);
}

 

위의 부분이 dst와 src의 문자열 길이를 비교하는 부분이다.

 

 

디버깅을 진행하여 패스워드 입력 값으로 “hello world”라는 문자열을 입력한 후

4015DC 주소의 strlen() 함수 call 명령 내부로 가면 위와 같이 나온다.

 

strlen() 함수 내부에서 위의 부분이 문자열의 길이를 구하는 부분이다.

 

8 글자씩 잘라내면서 문자의 길이를 구한다.

 

함수의 실행 결과는 EAX 레지스터에 저장된다.

 


strcmp()

 

40160B 주소의 루틴을 보면, 사용자가 입력한 문자를 rax 레지스터에 저장하고, 비교할 문자를 rdx 레지스터에 저장한 후 strcmp 함수를 호출한다.

 

 

strcmp 함수 내부로 들어가면 위와 같은 코드가 나온다.

 

rcx에 사용자가 입력한 패스워드 값, rdx에 지정된 값을 넣고 시작하여 각 문자열이 서로 일치한지 검사한다.

반응형

+ Recent posts