ipwn

[pwnable.kr] fd 본문

Write up/Pwnable.kr

[pwnable.kr] fd

ipwn 2017. 12. 28. 21:23



ssh 서버에 접속해보자.



이렇게 파일들이 나열된 것을 확인할 수 있다.


fd는 fd_pwn의 권한으로 setuid가 걸려있고, flag 파일의 권한은 fd_pwn이다.


아마 fd파일을 실행하면 flag를 읽어와주거나 쉘을 가져올 수 있는 것 같다.


이제 fd.c를 열어보자.



코드는 이렇게 작성되어있다.


가장 중요한 flag를 읽는 부분을 보니 buf와 "LETMEWIN\n"을 비교, 같은 문자열일 경우에 flag를 출력해준다.


그 이전에는 fd의 값에 argv[1]을 받아와 atoi함수를 실행한 값에서 0x1234를 빼준 값이 들어간다.


그리고 밑 부분에는 read함수가 실행되는데 read함수의 원형은 size_t read(int fd, void *buf, size_t count);


위의 형태인데, fd는 file descriptor의 약자로써 특정 파일에 접근하는 값이라고 말할 수 있겠다.


그리고 buf는 값을 읽어와 저장해줄 데이터의 공간을 의미하고, count는 읽을 데이터 크기의 byte 단위이다.


fd의 값이 0일 때에는 stdin으로 표준 입력, 1일 때에는 stdout으로 표준 출력, 2일 때는 stderr으로 표준 에러를 의미한다.


(더 자세한건 검색 엔진에 file descriptor을 검색해보면 될 것이다.)


즉 우리는 직접 입력을 해 주어야하기 때문에 fd의 값을 0으로 만들어주면 된다는 말이다.


fd의 값에 0을 넣어주면 buf에 원하는 값인 "LETMEWIN\n"을 직접 입력해줄 수 있게된다.



0x1234의 값은 10진수로 4660이다. 이 값을 argv[1]로 넘겨주자.



이렇게 4660을 argv[1]로 넘겨주게 되면 "LETMEWIN\n"의 값을 원하는대로 입력을 할 수 있다.


저렇게 "LETMEWIN"을 입력해준 뒤 Enter을 누르게 되면 자동으로 개행이 입력되며 "LETMEWIN\n"의 값이 들어간다.



성공적으로 flag의 값을 읽어왔다.



'Write up > Pwnable.kr' 카테고리의 다른 글

[pwnable.kr] random  (0) 2018.01.01
[pwnable.kr] passcode  (0) 2018.01.01
[pwnable.kr] flag  (0) 2017.12.31
[pwnable.kr] bof  (0) 2017.12.31
[pwnable.kr] collision  (0) 2017.12.28
Comments