티스토리 뷰

문제 풀이에 앞서, 아래 사이트를 참고해 fd(file descriptor)에 대해서 참고.

http://levanterb.tistory.com/11 



문제를 보시면 애새끼가 엄마한테 리눅스의 파일 디스크립터가 뭐야?? 라고 힌트를 주네요.

일단, 접속을 해보겠습니다.


원격으로 접속한 결과 메타스플로잇 같이 멋있는 그림이 나옵니다.


ls -al로 파일의 권한을 확인해 보겠습니다. 일단 fd와 flag가 유심히 보이네요. fd에는 setuid 권한이 설정되어 있고, 답이 적혀있는 것 같은 flag 파일에는 fd2 권한이 되어야 볼 수가 있네요. 이제 fd 소스를 한번 보겠습니다.


일단, 버퍼오버플로우를 의심했었는데, 버퍼오버플로우에 취약한 함수가 쓰이지 않는걸로 봐서 아닌 것 같습니다. 

소스를 일단 설명하자면, fd의 인자 값(atoi(argv[1]))으로 받아서 0x1234(10진수로 변환 : 4660)을 빼줍니다. 그리고 read함수가 보이는데, read(a, b, c)를 설명하자면, a에는 파일 디스크립터 값을, b에는 읽은 데이터를 저장할 버퍼를, c에는 얼만큼 읽을지를 전달해주는 함수입니다. fd를 읽어서 b에 데이터를 저장합니다. 

즉, fd에 있는 값을 buf에 넣어서 "LETMEWIN"값과 비교하여 맞으면 pass인 과정입니다. if(!strcmp(a,b))에서 왜 '!'를 붙여 주었는가 하면, strcmp는 둘의 값이 일치하면 0을 반환합니다. 하지만 if는 0을 거짓으로 보기 때문에 '!'를 붙여준 것입니다. 


밑의 표에서도 보이듯이 fd는 0,1,2로 반환을 합니다. 0은 stdin, 1은 stdout, 2는 stderr를 반환하는데, 답을 찾기 위해서는 buf가 LETMEWIN이 되어야 한다고 했는데, 그러기 위해서는 입력을 받아야 합니다. 

입력을 받기 위해서는 fd값을 0으로 만들어줘야 하기 때문에 atoi(argv[1]) 부분을 0x1234로 입력해 주면 됩니다. 0x1234를 입력해줄 수는 없으니 10진수로 변환한 4660으로 변환하여 인자값으로 주면 fd는 0이되어 표준 입력을 받습니다. 


fd를 실행하고 4660을 입력하면 입력 값이 나오는데 LETMEWIN을 입력해봅시다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함