Pwnable/Pwnable.kr

pwnable.kr - 1 - fd

KSJ._.seven11 2023. 1. 25. 12:09

문제의 소스코드는 다음과 같다.

 

#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;

}

버퍼에 크기는 32Byte 이며 argc < 2 보다 작을때 다시 시도하게 한다.

 

입력받은 fd 값에 - 0x1234 를 빼야 한다.

 

C언어 atoi 함수는 Ascii to int 를 뜻하며 아스키 코드를 정수형 값으로 변환해 준다.

 

Read 함수에서 첫번째 인자 fd에 0이란 값이 들어가 표준입력으로 인식된다. ( 변수 len == 0;)

 

즉 키보드로 입력하는 buf 안에 값을 저장하게 된다.

 

이후 LETMEWIN\n 문자열과 Buf 를 비교하여 참이되어 1이 출력될 경우 flag를 획들 할 수 있는 구조다.

 

먼저 16진수 0x1234를 10진수 계산기로 계산하면 4660이 된다.

 

argc 1번째 값에 4660을 넣어 실행시킨다면 fd 값이 0이 될 것이다.

 

--> LETMEWIN 문자열을 입력하여 buf와 비교하고 1이 출력되어 플래그를 출력할 수 있을 것이다.

 

 

그렇게 플래그를 획득 할 수 있다.