본문으로 바로가기

Level7 문제 응용 (ASCII)

category Security/리버싱 2017. 11. 30. 18:42

ftz.hackerschool.org 의 이미지를 사용하여 실습했습니다. 


-Level7

level7 / come together


[level7@ftz level7]$ /bin/level7

 

Insert The Password : aaa

올바르지 않은 패스워드 입니다.

    패스워드는 가까운곳에...

--_--_- --____- ---_-__ --__-_-


 



[level7@ftz level7]$ /bin/level7

 

 Insert The Password : mate


Congratulation! next password is "break the world".

 


> 2진수를 ASCII 문자열로 바꾸는 문제였다. 


> 자동으로 바꿔주는 프로그램 작성

[level7@ftz level7]$ cd tmp

[level7@ftz tmp]$ vi conversion.c

 

 

#include <stdio.h>

#include <string.h>


#define MAXARRAY 4


int binToInt(char *bin);


int main()

{

        int i, decimal[MAXARRAY];

        char *bin="--_--_- --____- ---_-__ --__-_-";

        char *ptr=bin;

        char dec[MAXARRAY*8];

        char ascii[MAXARRAY];

        char cmd[5]={"\n"};


        printf("Resvered signals : --_--_- --____- ---_-__ --__-_-\n");

        for(i=0; i<strlen(bin); i++)

        {

                if(*ptr == '-')       dec[i] = '1';

                else if(*ptr == '_')  dec[i] = '0';

                else if(*ptr == ' ')  dec[i] = '\0';

                ptr++;

        }


        dec[i] = '\0';

        printf("Changed binary : %s %s %s %s\n", &dec[0], &dec[8], &dec[16], &dec[24]);

        printf("Changed decimal : ");

        for(i=0; i<MAXARRAY; i++)

        {

                decimal[i] = binToInt(&dec[i*8]);

                printf(" %d ", decimal[i]);

        }

        printf("\n");

        printf("Chaged ascii :");

        for(i=0; i<MAXARRAY; i++)

                printf(" %c ", decimal[i]);

         printf("\n");


         sprintf(cmd, "(printf \"%c%c%c%c\" ; cat) | /bin/level7", decimal[0], decimal[1], decimal[2], decimal[3]);

         system(cmd);


}


int binToInt(char *bin)

{

        int i=0;

        int count=0;

        while (bin[count])

                i=(i << 1) | (bin[count++] - '0');

        return i;

}


 

> sprintf의 cat 은 단지 기다리는 역할을 한다. 


[level7@ftz tmp]$ gcc -o conversion conversion.c

[level7@ftz tmp]$ ./conversion

 

 Resvered signals : --_--_- --____- ---_-__ --__-_-

Changed binary : 1101101 1100001 1110100 1100101

Changed decimal :  109  97  116  101

Chaged ascii : m  a  t  e

<enter>

Insert The Password :

Congratulation! next password is "break the world".

<enter>

 

> enter를 쳐야 넘어가는 이유가 cat이라는 명령어 때문이다. cat을 빼고 돌려보면 바로 출력 되는 것을 알 수 있다. 


[참고] binToInt 함수

 

 #include<stdio.h>


int binToInt(char *bin)

{

        int i=0;

        int count=0;


        while(bin[count])

        {

                i=(i << 1) | (bin[count++] - '0');

                printf("i = %d\n", i);

        }

        return i;

}


main()

{

        printf("%d\n", binToInt("1101101"));

}

 

> 매개변수로 받은 2진수로 된 문자를 하나씩 쉬프트 하면서 10진수로 바꿔준다.

> 이런 함수는 인터넷 상에 굉장히 많아 그냥 검색해서 하나 가져오면 된다. 
[참고 사이트] http://mwultong.blogspot.com/2006/10/c-10-2-decimal-to-binary-base-2.html




'Security > 리버싱' 카테고리의 다른 글

Level8 문제 해결  (0) 2017.11.30
Level7 의사코드  (0) 2017.11.30
Level7 문제 해결  (0) 2017.11.30
Level6 문제 분석 -의사 코드  (0) 2017.11.29
Level6 문제 해결  (0) 2017.11.29