ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Toddlers's Bottle] fd
    Wargame/pwnable.kr Challenge 2019. 1. 10. 14:06

    → 문제는 아래와 같다.





    → 로그인 후 파일 확인.




    → fd.c 소스 확인.




    → 소스분석 결과, 문제를 풀기 위해선 "!strcmp("LETMEWIN\n", buf)"을 참으로 만들어야 "good job :)" 이라는 메시지와 함께 /bin/cat/flag 명령어가 실행되서 flag 값을 알 수 있다. 따라서, buf 배열에 "LETMEWIN\n" 이라는 문자열이 저장되야 한다.


    → 그리고 buf 배열은 read 함수(read(fd,buf,32);)에 의해서 할당된다. 해당 read 함수를 해석하면, fd는 파일 디스크립터 값, buf는 읽은 데이터를 저장할 버퍼, 32 값은 얼만큼 읽을지를 전달하는 인자이다. 여기서 파일 디스크립터 값에 대해서 알아야 한다.


    → 리눅스 파일 디스크립터 값은 아래와 같다.




    → 표준 입력 값에 의해서, buf 함수에 "LETMEWIN\n" 문자열을 전달하는게 가장 편리하므로 파일 디스크립터를 0으로 맞춘다.


    → 파일 디스크립터 값의 계산은 다음과 같은 식에 의해서 결정된다.


    int fd = atoi(argv[1]) - 0x1234;


    → 아규먼트로 받은 문자열을 atoi 함수에 의해서 숫자형으로 변경한 후, 0x1234를 빼주는 값이다. 여기서 0x1234는 10진수로 4660 값이다.


    → 따라서, fd 값을 0으로 결정하기 위해선, argv[1] 아규먼트에 4660을 전달한다.


    → 아규먼트에 4660을 전달할 시, read(0,buf,32) 함수가 실행되어 다시 표준 입력을 받는 커맨더가 생길 것이며, 이 때, "LETMEWIN\n" 문자열을 입력하여 buf 함수에 저장된다면 플래그 값을 출력할 것이다.


    'Wargame > pwnable.kr Challenge' 카테고리의 다른 글

    [Toddler's Bottle] random  (0) 2019.02.19
    [Toddler's Bottle] flag  (0) 2019.02.14
    [Toddler's Bottle] bof  (0) 2019.01.22
    [Toddlers's Bottle] collision  (0) 2019.01.17

    댓글

Designed by Tistory.