티스토리 뷰
방학을 맞이해서 다양한 분야의 CTF 문제를 풀면서 공부하고 있다.
그 중 하나인 시스템 CTF 문제들을 모아둔 pwnable.kr 에서 1번 문제를 풀이 해보도록 하겠다.
제일 첫번째 문제 fd는 저기 귀여운 그림만큼 쉬운 문제인데 fd 개념을 이해하는데 시간이 좀 걸렸던 문제이다.
문제를 클릭하면 위와 같이 접속 경로와 문제 설명이 나온다.
적혀 있는 서버로 접속하여 문제를 풀면 된다. 접속 방법은 아래와 같다.
cmd에서 ssh fd@pwnable.kr -p2222 를 입력해 주고 주어진 패스워드 guest 를 입력해주면 위와 같이 pwnable.kr 에 접속 할 수 있다.
접속해서 ls 명령어로 파일을 읽어보면 파일은 총 fd, fd.c, flag 이렇게 3개의 파일이 존재한다.
ls -l 로 권한을 살펴보면 flag 는 root 만 읽을 수 있게 설정 되어있다.
fd.c 를 읽어보면 입력값이 2미만일때는
pass argv[1] a number가 출력되고 프로그램종료
2 이상일 때는
read() 함수를 이용해 파일을 읽고 buf와 문자열을 비교해 buf가 LETMEWIN\n 일 경우 good job과 함께 플래그값을 읽음
이 때 문제의 hint 를 보면 "Learn about LInux file IO"
그러면 Linux file IO 를 공부하러 가보자.
-FD(File Descriptor, 파일 서술자)
일반적으로 POSIX 운영 체제에 쓰이는 것인데 특정한 파일에 접근하기 위한 추상적인 키.
리눅스에서 파일에 접근하기 위해서는 이 FD 파일 서술자 라는 것을 사용 함.
파일 서술자는 정수, 즉 C 형 int임.
=기본 POSIX 파일 서술자
정수값 |
이름 |
0 |
표준 입력 (stdin) |
1 |
표준 출력 (stdout) |
2 |
표준 오류 (stderr) |
(https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC_%EC%84%9C%EC%88%A0%EC%9E%90)
위 문제에서 buf 와 입력값을 비교하기 위해서 파일 서술자를 이용해 파일에 입력을 하여야 한다.
여기서 사용 해야 할 것은 표준입력 파일 서술자 정수값인 "0"
fd.c 를 다시 한번 보면
int fd = atoi(argv[1]) - 0x1234; 라고 선언 되어 있고 이 fd 를 이용해
read(파일 디스크립터, 버퍼, 버퍼크기)를 지정해 주고 있다.
atoi()함수는 문자열을 숫자로 변환해 주는 함수이다.
따라서 읽어들인 fd 의 크기가 0이 된다면 파일 입력 모드로 설정 해 줄 수 있는 것!
fd의 크기를 0으로 만들기 위해서 0x1234 를 더해주면 되는 것이다.
그런데 이때 입력값은 헥사로 받지않고 있기 때문에 0x1234의 십진수 값인 4660을 입력하고 LETMEWIN을 입력하면
good job이 뜨고 flag 값이 나오게 된다.
'Write Up > pwnable.kr' 카테고리의 다른 글
pwnable.kr)shellshock (0) | 2019.04.02 |
---|---|
pwnable.kr)flag_리눅스 upx 언패킹 (2) | 2019.03.31 |
pwnable.kr)bof_버퍼오버플로우 (2) | 2019.03.29 |
pwnable.kr)cmd2_command함수_필터우회 (0) | 2019.03.25 |
pwnable.kr)cmd1_리눅스 환경변수_strstr() (2) | 2019.03.25 |
- Total
- Today
- Yesterday
- 스프링부트
- Android
- MVVM
- CTF
- Java
- AndroidX
- NumberFormatException
- 모바일리버싱
- 뷰모델
- 포너블.kr
- 웹 MVC
- androidstudio
- pwnable.kr
- 펌웨어 분석
- reversing.kr
- 정보보안
- reversing.kr풀이
- 에러
- 앱분석
- 안드로이드
- Spring
- DataBinding
- writeup
- 리버싱.kr
- 코드로 배우는 스프링 부트
- 리버싱기초
- exception
- 동적분석
- 자바
- 칼리리눅스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |