Pwnablekr_Toddlers Bottle_fd


문제에 적힌 서버에 접속하면 C 파일과 실행 파일, 그리고 flag 파일이 있다. flag는 권한이 없어 열 수 없다.

C언어 파일에서 핵심 알고리즘을 정리하면 다음과 같다.
argv[1]을 숫자로 변환하고, 그 값에서 0x1234를 뺀 값을 read 함수에 이용한다.- read함수로 읽은 문자열을
LETMEWIN\n문자열과 비교한다. - 같다면, flag 파일을 읽어준다.
read 함수와 fd 파라미터가 핵심이다. read 함수에 대해 알아보자.

주어진 C언어 코드에서는 open 함수를 호출하지 않는다. 주목할 점은 read 함수가 파일 디스크립터를 이용한다는 점이다.
read 함수의 파일 디스크립터에 stdin을 이용하면 파일 I/O가 아니라 사용자의 stdin 입력을 받을 수 있다.

stdin, stdout, stderr의 파일 디스크립터는 위와 같이 정의되어 있다. 그 중 필요한 stdin은 0이다.
즉, read 함수가 stdin을 이용하도록 하기 위해서는 파일 디스크립터로 이용되는 fd 파라미터의 값이 0이 되어야겠다.
fd = atoi(argv[1]) - 0x1234 이므로, atoi(argv[1])의 결과가 0x1234가 되어야 한다.
atoi 함수에 대해서 정확히 알아보자.

atoi함수는 10진수 정수 문자열을 정수로 변환한다. 따라서 입력값으로 16진수 그대로 0x1234를 입력해서는 안 된다. 대신에 0x1234를 10진수로 변환한 값을 넣어야 한다.

0x1234를 10진수로 변환하면 4660이다.
이제 프로그램 입력값으로 4660을 준 뒤, LETMEWIN\n 문자열을 입력해 보자.

성공하고, flag를 출력해 준다.
flag는 mommy! I think I know what a file descriptor is!! 이다.