-> https://pwnable.kr/play.php
pwnable.com 에 접속하면, 다음과 같은 화면이 나온다.
이중 fd 문제를 풀 것이다.
- 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수 값
- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스
리눅스 혹은 유닉스 계열의 시스템에서 프로세스가 파일을 다룰 때 사용하는 개념
프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값
일반적으로 0이 아닌 정수 값을 가진다.
프로세스가 실행 중에 파일을 open 할시, 커널은 해당 프로세스의 숫자 중 사용하지않는 가장 작은 값을 할당 해 준다. 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용하여 접근할 때, FD 값을 이용해서 파일을 지칭 할 수 있다.
FD table 의 각 항목은 FD flag 와 file table 로의 포인터를 가지고 있다.
이 포인터를 이용하여 시스템의 파일을 참조하는 것이 가능하다.
$ ssh fd@pwnable.kr -p2222
pw: guest
$ ls -l
명령어를 통해 확인해 본 결과, 다음과 같은 파일이 존재한다
$ vim fd.c
위 명령어로 C언어로 작성된 fd.c 파일을 vim 편집기로 확인해보면,
아래 포스팅 참고!
https://velog.io/@efforterjisulee/C-etc.-main-argc-argv
int main(int argc, char* argv[], char* envp[])
세번째 인자로 '시스템환경 변수'에 대한 정보를 받아 올 수 있다.
프로세스가 실행 될때 받아온 최초의 환경변수를 개발자가 확인 할 수 있도록 제공되는것이다.
저장 형식은 argv 와 같다.
아래 포스팅 참조!
https://velog.io/@efforterjisulee/C-etc.-atoi
요약: string -> int 값으로 return 해주는 function
form: read(fd, buf, size)
string 비교함수
명령어 처리기를 호출해서 매개변수로 입력한 명령어를 실행하는 함수
C program 완전 종료기능 (모든 열린 파일 자동 close)
에러가 났을때 강제 종료 시키기 위해 if 문 속에서 자주 사용
$ ssh fd@pwnable.kr -p2222
pw: guest
$ ls -l
$ vim fd.c
$ ./fd 4460
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 파일의 내용이자, 값이다!
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진수 반환기