[Pwnable.kr] fd
문제
ssh로 pwnable.kr 서버 포트 2222로 접속하라고 한다.
해주자
분석
병적으로 ls를 쳤더니 flag파일이 있었다.
그러나 저 파일은 권한이 440으로 guest로 진입한 내 계정으로는 볼 수 없는 파일이다.
fd를 실행해보면
이렇게 리눅스 파일의 입출력에 대해 공부하라고 나온다.
아쉬운대로 fd.c파일을 보자 vim으로 보면 한눈에 확 들어온다.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 char buf[32];
5 int main(int argc, char* argv[], char* envp[]){
6 if(argc<2){
7 printf("pass argv[1] a number\n");
8 return 0;
9 }
10 int fd = atoi( argv[1] ) - 0x1234;
11 int len = 0;
12 len = read(fd, buf, 32);
13 if(!strcmp("LETMEWIN\n", buf)){
14 printf("good job :)\n");
15 system("/bin/cat flag");
16 exit(0);
17 }
18 printf("learn about Linux file IO\n");
19 return 0;
20
21 }
소스코드를 분석해보자.
6번줄에서 인자가 몇개여야하는지 간접적으로 알려준다. 인자는 1개여야한다
정수형 변수 fd를 정의한다.
정수형 변수 len을 초기화한다.
len함수를 정의하는데 read함수가 사용된다.
문자열 "LETMEWIN"와 buf를 비교한다. 참일경우 문자열 "good job :)" 실행
풀이
먼저 atoi 함수가 무엇인지 알아야 한다.
atoi 함수란?
atoi() 함수는 문자 스트링을 정수값으로 변환하는 함수로서, 숫자형태의 문자열을 문자그대로 정수로 변환해줄 수 있다.
ex) "23562" -> 23562
여기서는 프로그램 실행시 인자를 받을때 문자열 형태로 받으니 이를 숫자로 변환해주려고 하는 것이다.
다음은 read함수다.
read 함수란?
read()함수는 파일의 내용을 읽는 함수로 기본적인 형태는 다음과 같다.
#include <unistd.h> ssize_t read (int fd, void *buf, size_t len)
여기서 read 함수의 매개변수로 들어가는 것은
파일 디스크립터의 fd, 읽은 데이터를 넣을 버퍼 buf, 데이터를 읽을 사이즈 len이다.
그중 우리는 파일디스크립터인 fd에 대해서 좀더 알아보겠다.
파일 디스크립터, fd란?
파일 서술자(File Descriptor, fd)는 유닉스 계열의 운영체제에서 파일에 접근하는 소프트웨어에 제공하는 가상의 접근 제어자입니다.
프로세스마다 고유의 서술자 테이블을 갖고 있으며, 그 안에 여러 파일 서술자를 저장합니다.
서술자 각각은 번호로 구별되는데, 일반적으로 0번은 일반 입력(Standard Input, STDIN), 1번은 일반 출력(Standard Output, STDOUT), 2번은 일반 오류(Standard Error, STDERR)에 할당되어 있으며, 이들은 프로세스를 터미널과 연결해줍니다.
그래서 우리는 키보드 입력을 통해 프로세스에 입력을 전달하고, 출력을 터미널로 받아볼 수 있습니다.
fd 프로그램은 strcmp를 통해 "LETMEWIN\n"와 buf가 같은지 확인을 한다.
같게 되면 strcmp는 참일경우 0을 반환하게 되므로 not 연산자(!)를 써서 if문을 참으로 만들어준다.
따라서, 우리는 read 함수의 fd 매개변수를 0으로 만들어 입력모드로 바꾸어 "LETMEWIN" 문자열을 입력하면, if문이 참이 될 것이라고 추론할 수 있다.
결과
0x1234가 10진수로 4660임을 알 수 있다.
)
끝.
'Write-up > Wargame' 카테고리의 다른 글
[Dreamhack] basic_exploitation_000 (0) | 2024.03.24 |
---|---|
[Dreamhack] ReturnAddressOverwrite (1) | 2024.03.22 |
[Dreamhack wargame] rev-basic-4 (1) | 2023.11.12 |
[Dreamhack wargame] rev-basic-3 (0) | 2023.09.04 |
[Dreamhack wargame] Quiz: x86 Assembly 2 풀이 (0) | 2022.09.25 |