티스토리 뷰

WarGame/Pwnable.kr

fd

Cand0 2018. 12. 4. 11:26

사전 분석


./fd OOO 이런식으로 입력하면 될 듯 하며 buf의 값은 LETMEWIN과 같아야 한다.

buf와 관련 있는 문장은 len = read(fd, buf, 32); 만 있으며 read 함수를 알아보면,

 

read 함수란?

원형 : ssize_t read(int fd, void *buf, size_t nbytes)

fd

파일 디스크립터

*buf

파일을 읽어 들일 버퍼(변수)

nbytes

버퍼의 크기

size_t(반환 값)

정상적으로 실행되었다면 읽어 들인 바이트 수, 실패하면 1을 반환.

 

 

fd(File Descriptor) ?

:특정한 파일에 접근하기 위한 추상적인 키. ( 보다 쉽게 파일에 접근하기 위해서 )

 

쉽게 설명하면 파일 KonYangUniversityCyberSecurity.txt 라는 파일을 불러오기보다는

4: KonYangUniversityCyberSecurity.txt 로 정하며, 이를 부를때는 4!주세요 라고 하는 것이 더 편할 것이다.

 

그리고 fd 테이블에는 예약된 것이 있다.

0 :: 표준 입력(stdin)

1 :: 표준 출력(stdout)

2 :: 표준 오류(stderr)

은 사전에 fd 테이블에 예약 되어 있으며 첫 번째 파일은 3번부터 적재된다.

?? 아까전에는 fd는 파일에 접근하기 위한 것이라고 하지 않았느냐???

 

리눅스의 경우에는 장치등을 파일 단위로 관리한다. 그렇기 때문에 입력, 출력, 오류를 처리하기 위해 파일처럼 불러오는 것이다.

 

이를 정리해보면 buf는 현재 비어있으며 fd의 값이 0이되면 입력을 하라고 나올 것이다.

하지만!! fd12가 되어도 입력을 받게 되어있는데 이는 현재 buf는 전역변수로써 초기화 되어있지 않아 값이 들어있지 않다. 그렇기 때문에 12를 맞추어 주어도 입력을 받을 수 있게 된다.

 

결과 도출

그렇다면 fd에는 어떻게 숫자를 넣을 수 있을까?

 

int fd = atoi( argv[1] ) - 0x1234; 이런 문장이 있다.

 

atoi ?

atoi : 받은 문자를 앞자리부터 차례대로 숫자로 표현.

ex) atoi(12qw13) => 12

atoi(1213) => 1213

fd.hwp


 

0x1234 (16진수) ==> 4660이 된다.

 

따라서 4660을 입력하게 되면 fd에는 0이 된다.

 

ps. 쉘 코딩을 이용하여 브루드포싱을 할 수도 있다.

 

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

bof  (0) 2019.01.10
collision  (0) 2019.01.04
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   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
글 보관함