ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Toddler's Bottle] fd write-up
    System hacking training/pwnable.kr 2018. 7. 1. 02:47

    pwnable.kr fd 문제를 풀었습니다.

    file descriptor 에 대한 문제임을 예상할 수 있었습니다.

    ssh로 remote 연결을 하여 진행을 하는 방식입니다.

    접속하여 ls 명령어로 어떤 파일들이 있는지 보니 fd라는 실행파일에 setuid가 걸려있습니다.

    fd.c는 fd에 대한 소스코드인듯 합니다. LOB와 비슷합니다 ㅎㅎ

    바이너리 이름에서부터 알 수 있듯이 이 문제는 fd 즉 파일 디스크립터에 관한 문제입니다.

    먼저 코드 분석을 해보았습니다.

    1. argc 즉 인자가 파일명 빼고 하나 더 있어야 합니다.

    2. fd라는 변수에 atoi()로 argv[1]을 받아 정수형으로 반환하고 0x1234를 뺀 뒤 저장합니다.

    3. len 변수에 read()의 return 값을 저장합니다.

    4. read()에서 fd가 바라보고 있는 파일에서 32byte길이 만큼 buf에 읽어들입니다.

    5. strcmp()로 buf에서 LETMEWIN\n이라는 값을 비교하고 맞다면 flag값을 열어줍니다.

    파일 디스크립터에 관한 문제이니 개념을 잡고 가겠습니다.

    • 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수값

    • 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스

    흔히 유닉스 시스템에서 모든 것은 파일이라고 한다. 유닉스 시스템에서는 모든 장치를 파일로 관리하는데, 내부/외부 모든 장치도 파일로 취급한다. 이 파일을 관리하는 것이 파일 디스크립터다.

    여기서 미리 예약되어 있는 값이 있는데

    표준 입력 : 0 | 표준 출력 : 1 | 표준 에러 출력 : 2

    이렇기 때문에 파일을 가리키는 값은 3부터 그 이상의 값으로 할당이 된다.

    다시 문제풀이로 돌아와서 파일을 가리키는 값 즉 fd를 직접 인자값을 받아서 지정해 줄 수 있는데 이 값은 0으로 해준다면 read()에서 buf에 LETMEWIN이라는 문자열을 넣어줄 수 있을것 같다.

    0x1234는 4660이고 이를 인자로 준다면 fd값이 0이 될 것이다.

    flag를 출력해냈다.


    [번외]

    혹시나 했는데 fd값이 0, 1, 2 일때 모두 flag값이 출력이 된다....

    왜 그런지는 모르겠지만 앞서 파일 디스크립터의 리눅스에서의 역할을 생각해본다면 파일을 가리키는 값이므로 0, 1, 2는 예약되어있는 값으로 예외적인 행동을 한다고 예상이된다....

    반응형
Designed by Tistory.