pwnable.kr fd
Mommy! what is a file descriptor in Linux?
* try to play the wargame your self but if you are ABSOLUTE beginner, follow this tutorial link:
https://youtu.be/971eZhMHQQw
ssh fd@pwnable.kr -p2222 (pw:guest)
####################################################################
파파고로 번역
엄마! 리눅스의 file descriptor는 뭐야?
* 스스로 워 게임을 해보십시오. 하지만 ABSOLUTE 초보자라면 다음 튜토리얼 링크를 따르십시오.
https://youtu.be/971eZhMHQQw
ssh fd@pwnable.kr -p2222(pw:guest)
##############################################################################
아래 주소로 접속하면 문제가 있다.
window에서의 ssh(SecureShell)은 여러가지가 있는데
https://amorfati-1000.tistory.com/50 아래를 참고해서 사용해도 되며
https://wnsgml972.github.io/setting/wsl.html ubuntu 환경을 설치해서 접속해도 된다.
vwmare를 통해 kali나 ubuntu환경을 직접 구축하여 풀어도된다.
접속해보자.fd해서 ls -l 명령어를 통해 파일들을 확인해보니 flag, fd.c,fd 세가지 파일이 나온다.
fd@prowl:~$ ls -l
total 16
-r-sr-x--- 1 fd_pwn fd 7322 Jun 11 2014 fd
-rw-r--r-- 1 root root 418 Jun 11 2014 fd.c
-r--r----- 1 fd_pwn root 50 Jun 11 2014 flag
각필드가 의미하는것
https://blog.naver.com/sjc02183/221711362671
cat flag를 시도해보면 permission denied가 뜨는걸 확인할수 있다.
fd의 계정으로는 fd.c를 읽을수 있고 fd를 읽고 실행할수 있는 권한이있다.
sticky bit가 설정되있어 fd를 실행시 fd_pwn의 권한으로 실행할수 있다.
먼저 fd.c를 읽어보자
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
if(argc<2){
printf("pass argv[1] a number\n");
return 0;
}
int fd = atoi( argv[1] ) - 0x1234;
int len = 0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf)){
printf("good job :)\n");
system("/bin/cat flag");
exit(0);
}
printf("learn about Linux file IO\n");
return 0;
}
c언어를 해석해보면
main함수에 대한 설명
https://m.blog.naver.com/jsky10503/221203136166
http://soen.kr/lecture/ccpp/cpp1/10-4-2.htm
넘겨주는 인자가 없다면 pass argv[1] a number\n 메시지를 띄운다
두번째 인자를 atoi에 넣어 정수로 바꾼다.
atoi함수
https://dojang.io/mod/page/view.php?id=385
0x1234는 16진수 표기법으로 10진법으로 바꾸면 4660이다.
받은 인자에 4660을 빼서 fd에 넣어준다
read함수
http://forum.falinux.com/zbxe/index.php?mid=C_LIB&document_srl=466628
strcmp함수
https://dojang.io/mod/page/view.php?id=346
read 의 첫번째 인자가 0일때 버퍼에 쓸수 있기 때문에 첫번째 인자는 0이 되어야 하고
뒤에 퍼버 인자는 우리가 직접 입력했을때 들어갈것이다. 3번째인자는 버퍼의 크기이다.
이제 버퍼의 내용이 LETMEWIN 과 같다면 cat flag가 실행되어 flag안의 내용을 확인할수 잇을것이다.
먼저 첫번째 인자가 0이 되기위해선 인자의 값을 4660으로 주고 실행시켜야한다.
./fd 4660으로 실행해보자
버퍼를 받기위해 기다리고 있을것이다.
LETMEWIN을 치고 엔터를 치면 flag를 확인할수 있다.
flag를 입력해주면 성공