PWN fd
http://pwnable.kr/play.php
writeup을 보면 file desctriptor라는 단어가 나온다.
file descriptor은 줄여서 fd라 말하는데 파일을 다룰때 사용한다. 파일 디스크립터는 음수가 아닌 정수로 번호를 항당 받아 사용하는데 이는 fd가 fd tabel로 부터 온 것이기 때문이다. 이들의 인덱스를 의미하기 때문에 음수가 아닌 숫자로 표현이 가능하며 fd는 파일을 가르킬 수 있도록 파일 테이블의 포인터를 포함한다. 0~2까지는 기본적으로 할당 된 프로세스들이 존재하고 새로운 파일을 열때는 이 외의 숫자로 fd가 할당된다. fd 0은 표준 입력, fd 1은 표준 출력, fd 2는 표준 에러를 의미한다.
이제 우분투로 들어가서 위 사진에 나온 ssh를 입력해 접속했다.
가장 먼저 한 일은 어떤 파일과 디렉토리들이 있는지 확인하기 위해서 ls- al 명령어를 사용했다.
일단 fd.c라는 파일이 있길래 어떤 프로그램인지 확인했다.
코드를 해석하자면 아래와 같다.
if(입력 단어가 2개 미만이면) "pass argv[1] a number" 출력
fd = 입력한 2번째 단어를 정수로 바꾼 수 - 16진수로 1234
buf에 fd가 가르키는 문자열 32 비트까지 넣어주기
if(buf가 LETMEWIN과 같다면) flag실행
"learn about linux file IO"출력
그럼 여기서 flag를 실행하기 위해서는 buf에 들어가는 문자열이 LETMEWIN이여야 한다. 그러기 위해서는 fd가 가르키는 문자열이 LETMEWIN이여야 하는데 이는 fd = atoi(argv[1]) - 0x1234 를 통해 해결 할 수 있다.
일단 atoi는 입력받은 문자열을 수로 변환시켜준다. 그렇다면 argv[1] - 0x1234의 값에 대해 생각해 봐야한다. 원래 fd는 파일을 가르키지만 여기는 열만한 파일이 없다. 즉, 사용자의 입력값을 받아줘야 한다는 것인데 여기서 사용할 것이 바로 fd 0인 표준입력이다. 따로 파일을 읽지 않아도 사용자가 입력한 값을 받을 수 있게 한다. 그럼 fd값을 0으로 만들어줘야하니까 argv[1]을 0x1234와 같은 값으로 만들면된다. 0x는 16진수를 의미하니까 0x1234는 10진수로 4660이 된다.
먼저 ./fd 4660을 입력하고 엔터를 누르면 fd가 표준입력이 되면서 또 입력할 수 있도록 커서가 깜빡거린다. 여기에 LETMEWIN을 쓰고 다시 엔터를 누르면 성공!
참고:
http://dev-ahn.tistory.com/96
https://en.wikipedia.org/wiki/File_descriptor#Creating_file_descriptorshttp://norux.me/24
https://github.com/whdlgp/system_programming_pra/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4%EC%97%90%EC%84%9C%EC%9D%98-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EB%A3%A8%EA%B8%B0
http://pwnable.kr/play.php
writeup을 보면 file desctriptor라는 단어가 나온다.
file descriptor은 줄여서 fd라 말하는데 파일을 다룰때 사용한다. 파일 디스크립터는 음수가 아닌 정수로 번호를 항당 받아 사용하는데 이는 fd가 fd tabel로 부터 온 것이기 때문이다. 이들의 인덱스를 의미하기 때문에 음수가 아닌 숫자로 표현이 가능하며 fd는 파일을 가르킬 수 있도록 파일 테이블의 포인터를 포함한다. 0~2까지는 기본적으로 할당 된 프로세스들이 존재하고 새로운 파일을 열때는 이 외의 숫자로 fd가 할당된다. fd 0은 표준 입력, fd 1은 표준 출력, fd 2는 표준 에러를 의미한다.
이제 우분투로 들어가서 위 사진에 나온 ssh를 입력해 접속했다.
가장 먼저 한 일은 어떤 파일과 디렉토리들이 있는지 확인하기 위해서 ls- al 명령어를 사용했다.
일단 fd.c라는 파일이 있길래 어떤 프로그램인지 확인했다.
코드를 해석하자면 아래와 같다.
if(입력 단어가 2개 미만이면) "pass argv[1] a number" 출력
fd = 입력한 2번째 단어를 정수로 바꾼 수 - 16진수로 1234
buf에 fd가 가르키는 문자열 32 비트까지 넣어주기
if(buf가 LETMEWIN과 같다면) flag실행
"learn about linux file IO"출력
그럼 여기서 flag를 실행하기 위해서는 buf에 들어가는 문자열이 LETMEWIN이여야 한다. 그러기 위해서는 fd가 가르키는 문자열이 LETMEWIN이여야 하는데 이는 fd = atoi(argv[1]) - 0x1234 를 통해 해결 할 수 있다.
일단 atoi는 입력받은 문자열을 수로 변환시켜준다. 그렇다면 argv[1] - 0x1234의 값에 대해 생각해 봐야한다. 원래 fd는 파일을 가르키지만 여기는 열만한 파일이 없다. 즉, 사용자의 입력값을 받아줘야 한다는 것인데 여기서 사용할 것이 바로 fd 0인 표준입력이다. 따로 파일을 읽지 않아도 사용자가 입력한 값을 받을 수 있게 한다. 그럼 fd값을 0으로 만들어줘야하니까 argv[1]을 0x1234와 같은 값으로 만들면된다. 0x는 16진수를 의미하니까 0x1234는 10진수로 4660이 된다.
먼저 ./fd 4660을 입력하고 엔터를 누르면 fd가 표준입력이 되면서 또 입력할 수 있도록 커서가 깜빡거린다. 여기에 LETMEWIN을 쓰고 다시 엔터를 누르면 성공!
참고:
http://dev-ahn.tistory.com/96
https://en.wikipedia.org/wiki/File_descriptor#Creating_file_descriptorshttp://norux.me/24
https://github.com/whdlgp/system_programming_pra/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4%EC%97%90%EC%84%9C%EC%9D%98-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EB%A3%A8%EA%B8%B0
댓글
댓글 쓰기