pwnable.kr에서 가장 쉬운 Toddler's bottle, 그 중 제일 기본적인 fd문제이다.
우선 소스코드를 확인해보자.
main의 argument로 받은 값을 atoi함수를 사용해 int로 변환시킨다.
argument로는 int값을 줘야 되는 것 같다.
정수형으로 바꾼 argument값에서 0x1234를 뺀 값을 fd라는 변수에 저장하고
read()함수에서 file descriptor로 사용해 값을 읽어와 buf에 저장한다.
그리고 이 값이 문자열 "LETMEWIN"과 같으면 flag를 보여준다.
보통 file descriptor는 open함수를 사용해 생성하지만 이 코드에선 어디에서도 open함수를 사용하지 않는다.
즉 기존에 있는 file descriptor를 사용해야 한다.
리눅스에선 다음과 같이 file descriptor table을 만들어 모든 입력 및 출력을 받아온다.
standard in, standard out도 마찬가지로 txt파일에 있는 값을 read, write함수를 사용해 읽어오듯 입력을 받는다.
이 때 stdin의 file descriptor는 0, stdout은 1을 사용한다.
즉 위 코드에서 fd변수에 0이 입력되고나서
read(fd, buf, 32); 이 줄이 실행되면 stdin으로 buf에 값을 넣어줄 수 있다.
그럼 atoi(argv[1])의 값이 0x1234 여야한다.
0x1234 = 4660
이렇게 사용자 입력을 기다린다.
LETMEWIN을 입력해주면 이렇게 flag를 확인할 수 있다