[SystemHacking] [CTF] [pwnable.kr] [fd]

marceline·2023년 6월 20일
0

[System Hacking]

목록 보기
14/17

pwnable.kr 사이트

-> https://pwnable.kr/play.php

pwnable.com 에 접속하면, 다음과 같은 화면이 나온다.

이중 fd 문제를 풀 것이다.

fd : File Descriptor

  • 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값
  • 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스

리눅스 혹은 유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용하는 개념
프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값
일반적으로 0이 아닌 정수 값을 가진다.
프로세스가 실행 중에 파일을 open 할시, 커널은 해당 프로세스의 숫자 중 사용하지않는 가장 작은 값을 할당 해 준다. 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용하여 접근할 때, FD 값을 이용해서 파일을 지칭 할 수 있다.

  • Standard Input: 0
  • Standard Output: 1
  • Standard Error: 2

FD table 의 각 항목은 FD flag 와 file table 로의 포인터를 가지고 있다.
이 포인터를 이용하여 시스템의 파일을 참조하는 것이 가능하다.

fd 접속

$ ssh fd@pwnable.kr -p2222
pw: guest

$ ls -l

명령어를 통해 확인해 본 결과, 다음과 같은 파일이 존재한다

  • fd, fd.c, flag
$ vim fd.c

위 명령어로 C언어로 작성된 fd.c 파일을 vim 편집기로 확인해보면,

main() 의 parameter 에 대해서

아래 포스팅 참고!

https://velog.io/@efforterjisulee/C-etc.-main-argc-argv

main()의 envp 에 대해서

int main(int argc, char* argv[], char* envp[])

세번째 인자로 '시스템환경 변수'에 대한 정보를 받아 올 수 있다.

프로세스가 실행 될때 받아온 최초의 환경변수를 개발자가 확인 할 수 있도록 제공되는것이다.
저장 형식은 argv 와 같다.

atoi()

아래 포스팅 참조!
https://velog.io/@efforterjisulee/C-etc.-atoi
요약: string -> int 값으로 return 해주는 function

read()

아래 포스팅 참조!
https://velog.io/@efforterjisulee/C-etc.-read-%ED%8C%8C%EC%9D%BC-%EC%9D%BD%EA%B8%B0-%ED%95%A8%EC%88%98

요약

form: read(fd, buf, size)

strcmp()

string 비교함수

  • 두 문자열이 완전히 같을시, 0 반환
  • string1 < string2 일시, 음수 반환
  • string1 > string2 일시, 양수 반환

    즉, buf에 LETMEWIN 을 입력해주면 1을 반환, 즉 if 조건문 아래 문장 ("good job" 출력 및 system, exit 함수 실행)

system()

명령어 처리기를 호출해서 매개변수로 입력한 명령어를 실행하는 함수

exit()

C program 완전 종료기능 (모든 열린 파일 자동 close)
에러가 났을때 강제 종료 시키기 위해 if 문 속에서 자주 사용

  • exit(0): 에러없이 정상 종료
  • exit(1): 에러발생, 종료

exploit code

$ ssh fd@pwnable.kr -p2222
pw: guest
$ ls -l
$ vim fd.c
$ ./fd 4460

./fd 4660의 이유

fd == 0 이 나와야하기 때문에


argv[1] 에 4660의 주소값을 넣어주면, fd == 0 이 되고, buf에 입력값을 입력할 수 있는 상태가 된다.

즉, ./fd 4660 실행시 buf에 값을 입력 시킬 수 있고, 그 뒤 LETMEWIN을 입력하여 if 조건문에서 1을 반환하게끔 할시에,
위 실행결과와 같이 "good job :)" 이 출력된 후 ,
system() 에 의해서 "/bin/cat flag" 명령어가 실행된다.
따라서 화면에 출력된
"mommy! I think I know what a file descriptor is!!"
가 system 명령을 실행하여 볼 수 있었던 flag 파일의 내용이자, 값이다!

Reference

FD: File Descriptor
main() 의 parameter: jisu의 velog main() parameter
atoi(): jisu의 velog atoi()
read(): jisu의 velog read()
system(): system()
exit(): exit()
16진수<->10진수 반환기: 16진수<->10진수 반환기

0개의 댓글