본문 바로가기
보안과정/리버싱

Level 7 → Level 8

by Luuii 2017. 11. 29.

www.hackerschool.org 를 이용하여 공부한다.



목적 : 암호학에 대하여( 2진수 ↔ 10 진수 ↔ 16진수 )


printf() 함수를 사용할 때 메모리에 2진수로 값이 저장되어 있지만 사람이 이해하기 쉽도록 하기 위해서 %c를 지정하면 한 글자가 보이고, %d로 지정하면 모니터에 정수가 출력된다.


반대로 사용자가 메모리에 원하는 문자를 저장하려면 아스키 테이블을 보고, 그 문자에 해당하는 16진수 값을 저장해야 한다.


8진수는 3자리 씩 끊고

16진수는 4자리 씩 끊고

10수로는 자리마다 끊은 걸 더해주고


[EX]

16진수 → 8진수

> 16진수는 2진수로 전환했다가 8진수로 바꾼다.

2F → 0010 1111 → 00/101/111 → 0/5/7 → 57



level7 사용자로 로그인

ID : level7

PASS : come together


[실습을 위한 준비]

$ su root


$ cat << EOF >> /bin/wrong.txt

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

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

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

EOF


$ cat /bin/wrong.txt

$ exit


[실습]

$ ls -l

$ cat hint


$ find / -name level7 2>/dev/null

$ find / -user level8 -perm -4000 2>/dev/null


※ 코딩 안에 암호가 절대로 들어있으면 안된다.

strings 이면 끝이다


$ ls -l /bin/level7

$ /bin/level7


※ 소문자 a, 대문자 A 아스키 코드 값은 필히 암기해 두자.


[참고][클릭] 아스키코드표


--_--_- --____- ---_-__ --__-_-    → 여기에 규칙이 있는 것 같다.

- = 1

_ = 0

 구분

표기 예 

아스키 문자열 

 2진수(Bin)

 1101101 1100001 1110100 1100101

?

 10진수(Dec)

 109        97        116        101

 mate

 16진수(Hex)

 6d        61          74         65

 mate


$ /bin/level7


○ 공격용 코드를 만들어보자

[참고] http://mwultong.blogspot.com/2006/10/c-10-2-decimal-to-binary-base-2.html

binToInt(char *bin) 함수.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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;     //1101101
            //1
}
 
main()
{
        printf("%d\n", binToInt("1101101"));//1101101 -> 스트링처럼 인식이 되어있다.
                    // 원래 컴퓨터에는 1010로 들어가있다.
                    // a지만 실제로 컴퓨터에는 101010로 들어가있는거여
                    // 이 값을 하나씩 뽑아서 실제 메모리 
}
cs

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

<< : 오른쪽 쉬프트(Shift) 연산자(형식 : 데이터 << 이동할 비트수)

|   : 비트합 연산자(예제 : 0 | 0 = 0 , 0 | 1 = 1 , 1 | 0 = 1 , 1 | 1 = 1)


$ cd tmp

$ vi conversion.c

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
#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);
}
//cat을 쓴 이유 잠깐 대기상태를 만들기 위해서. 특별한 의미는 없다. 하지만 자주 쓴다.
 
int binToInt(char *bin)
{
        int i=0;
        int count=0;
 
        while (bin[count])
                i=(i << 1| (bin[count++- '0');
 
        return i;
}
cs


$ ./conversion


○ /bin/level7 파일을 disassemble 하여 의사코드 만들어보기

> root 사용자로 분석.

> 함수예) http://forum.falinux.com/zbxe/index.php?mid=C_LIB&document_srl=520935

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
 
int main()
{
    char *put_char;
    put_char = (char *)malloc(100);
 
    printf("Insert The Password : ");
    fgets(put_char,100,stdin);
 
    if(strncmp(put_char,“mate”,4))
        system("cat /bin/wrong.txt");
    else
        printf("\nCongratulation! next password is \"break the world\".\n\n");
    return 0;
}
cs


반응형

'보안과정 > 리버싱' 카테고리의 다른 글

Level 9 → Level 10  (0) 2017.11.30
Level 8 → Level9  (0) 2017.11.30
Level 6 → Level 7  (0) 2017.11.29
Level 5 → Level 6  (0) 2017.11.29
Level 4 → Level 5  (0) 2017.11.28