ABOUT ME

정보보안을 전공하고, 전자공학을 복수전공하고, 컴퓨터공학을 부전공을 하고 있는 욕심 많은 19학번 학생입니다ㅎㅎ

Today
Yesterday
Total
  • [pwnable.kr] fd 문제 풀이 / write up / pwnable.kr 소개
    정보보안/CTF write-up 2022. 2. 14. 23:38

    한 동안 알고리즘 공부만 하다가, 다시 시스템 해킹을 공부하는 중인데요. 매번 미루기만 하던 pwnable.kr 문제를 풀어볼까합니다. 실력이 부족하다고 느껴서 계속 미루고 미뤘었는데, 그러다간 계속 늦어질 것만 같네요ㅎㅎ

     

     

    pwnable.kr

    pwnable.kr은 포너블, 시스템 해킹 문제들을 풀 수 있는 워게임 사이트입니다. 난이도 별로 4단계에 나눠져서 문제를 풀 수 있도록 되어있습니다.

     

    첫 번째 문제인 fd를 풀면서 이어서 설명하겠습니다.

     

     

    fd 문제

    문제별로 카드로 나와있는데, 우리가 풀어볼 문제인 fd 카드를 클릭하면 다음과 같은 팝업 창이 나오게 됩니다.

    CTF 형식의 게임이 처음인 사람들을 위한 유튜브 강의도 링크를 통해 볼 수 있습니다.

     

    상단에는 누군가에게 질문하는 형식으로 문제에 대한 간단한 설명이 나와있고, 하단에는 문제를 해결할 수 있는 서버 주소 또는 파일 링크 등이 담겨 있습니다.

     

    ssh를 통해 문제 서버에 접근할 수 있으므로, 터미널이나 ssh 프로그램을 통해 서버에 접속해줍니다.

     

     

    pwnable.kr 첫 접속 화면

    서버에 접속하여 로그인하면 다음과 같은 리눅스 시작화면을 볼 수 있습니다.

     

     

    ls -l 명령어

    ls -l 명령어를 입력하여 파일 목록들을 확인합니다. flag 파일은 권한으로 인해 확인할 수 없습니다. 이 문제에서 우리가 접근 가능한 파일은 fd와 fd.c 두 개 입니다. fd는 실행 파일이므로 그 소스 코드로 추정되는 fd.c를 먼저 한 번 열어보겠습니다.

     

     

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char buf[32];
    int main(int argc, char* argv[], char* envp[]){
            if(argc<2){
                    printf("pass argv[1] a number\n");
                    return 0;
            }
            int fd = atoi( argv[1] ) - 0x1234;
            int len = 0;
            len = read(fd, buf, 32);
            if(!strcmp("LETMEWIN\n", buf)){
                    printf("good job :)\n");
                    system("/bin/cat flag");
                    exit(0);
            }
            printf("learn about Linux file IO\n");
            return 0;
    
    }

    문제를 해결하기 위한 중점정인 사항은 3가지로 보입니다.

     

    첫 번째는 프로그램 실행 시 인자값이 하나 필요하다는 점이고, 두 번째는 fd에 어떤 값이 저장되는데, 이는 저희가 입력하는 매개변수 입력값이라는 점입니다. 마지막으로 buf와 LETMEWIN이라는 단어를 비교하여 우리가 원하는 플래그 값을 찾을 수 있는 것으로 보입니다.

     

    C언어에서 read 함수는 파일디스크럽터, 파일을 읽어들일 버퍼, 버퍼의 크기를 매개변수로 받습니다.

     

    이 중 파일 디스크럽터는 0, 1, 2 일 때마다 다른 상태 값을 갖습니다.

    0은 표준 입력 / 1은 표준 출력 / 2는 표준 에러입니다.

     

    표준 출력을 해주기 위해 fd를 0으로 만들어주어야 합니다.

     

    0x1234는 10진수로 4660입니다.

     

    프로그램을 실행할 때 매개변수로 4660을 넣고, LETMEWIN 값을 입력하면, 문제가 해결됩니다.

     

    그리고 여기서 얻은 flag 값을 넣어주면, 다음과 같은 alert 창이 나타납니다.

    반응형
Designed by Tistory.