파일 디스크립터(fd)에 대한 문제인데,
파일 디스크립터(file descriptor)란?
- 시스템으로부터 할당 받은 파일을 대표하는 정수 값(0,1,2)
- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스
유닉스 시스템에서 프로세스가 파일들에 접근할 때, 파일 디스크립터를 사용한다.
표준입력 - 0
표준출력 - 1
표준에러 - 2
로 정수가 이미 할당되어 있다.
read()함수에서, 파일 지정 번호를 fd변수에 넣어줄 때 사용함.
flag는 당연히 못연다.
소스 해석을 해보면,
1. 인자로 전달된 값을 int형으로 만든다.
2. 이 값에 0x1234를 뺀 값을 fd에 저장한다.
3. read()함수 이용 - read()함수는 정상적으로 실행되면 읽어들인 바이트 수를 반환한다(참고)
- fd : 파일 디스크립터(표준입력 - 0 , 표준출력 - 1 , 표준에러 - 2)
- buf : 파일을 읽어들이는 버퍼
4. buf에 "LETMEWIN\n"문자열이 들어가도록 해야 if문이 실행될 것
5. read()함수를 이용할 때, fd의 값이 0이면 표준 입력을 지정해주므로 fd == 0 을 만들어서 read(0,buf,32) 로 만들어주면 buf에 내가 값을 입력할 수 있다.
6. argv[1]을 int형으로 만들고 0x1234를 빼주므로, 4660(0x1234)를 인자로 넘겨주면 fd == 0 이 된다.
7. 예상대로 표준입력을 지정해줘서 내가 입력해줄 수 있는 순간이 왔다. 여기에 LETMEWIN을 입력.
flag 획득.
'System Hacking' 카테고리의 다른 글
[pwnable.kr] Input (0) | 2019.07.28 |
---|---|
[pwnable.kr] flag (0) | 2019.07.17 |
[pwnable.kr] bof (0) | 2019.07.17 |
[pwnable.kr] passcode (0) | 2019.07.17 |
[Root-me]ELF x86 - Stack buffer overflow basic 1 (0) | 2019.07.03 |