pwnable.kr fd

보안/pwnable.kr / / 2019. 12. 11. 00:18
반응형

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

https://m.blog.naver.com/PostView.nhn?blogId=chhh92&logNo=220203886089&proxyReferer=https%3A%2F%2Fwww.google.com%2F


넘겨주는 인자가 없다면  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를 입력해주면 성공





반응형

'보안 > pwnable.kr' 카테고리의 다른 글

pwnable.kr random  (0) 2020.03.03
pwnable.kr passcode  (0) 2020.01.30
pwnable.kr flag  (0) 2020.01.30
pwnable.kr bof  (0) 2020.01.30
pwnable.kr collision  (0) 2019.12.11
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기