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 |