일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 정보보안기사
- wargame
- 정보처리기사 실기
- 정보보안기사 실기
- LOB
- system hacking
- BOF
- stack overflow
- 웹해킹
- webhacking
- 네트워크
- Operating System
- Spring Framework
- Spring MVC
- hacking
- 워게임
- pwnable
- PWN
- Spring
- Lord of BOF
- SQL
- Buffer Overflow
- Pwnable.kr
- OS
- Shell code
- webhacking.kr
- 해킹
- Payload
- 운영체제
- System
- Today
- Total
DongDD's IT
[pwnable.kr] fd 본문
[pwnable.kr] fd
Problem
Linux의 file descriptor가 무엇인지 묻고 있는 문제였다.
fd와 관련된 내용이 나올 것 같다는 생각이 들었다.
ssh로 fd@pwnable.kr에 접속하니 위와 같은 화면을 볼 수 있었다.
fd 실행파일과 fd.c 소스 코드 파일과 flag 파일이 있었다.
먼저 소스 코드를 확인해 보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #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; } | cs |
32 bytes의 buf가 전역 변수로 선언되어있었고 (argc < 2)이면 프로그램이 종료되기 때문에 argv를 1개 이상 받아야 한다. 받은 argv[1]을 atoi로 int형으로 바꿔주고 0x1234를 뺀 값을 fd에 넣어준다.
그 후에 read(fd, buf, 32)를 통해 fd로 부터 32 bytes만큼을 buf에 입력받는다.
buf가 "LETMEWIN"이라면 if문으로 들어가 system("/bin/cat flag")를 실행시켜 flag를 알려주는 형식으로 되어 있는 프로그램이었다.
Solution
1. fd를 stdin(0)으로 조작
File descriptor : 특정 파일에 대한 접근을 하기 위한 handle로 사용되는 키
먼저 Linux 시스템에서 기본적으로 설정되어 있는 file descriptor는 3가지가 있다.
stdin(0) : 사용자에게 입력을 받음
stdout(1) : 출력으로 사용자에게 보여줌
stderr(2) : 에러로서 사용자에게 보여줌
이 문제에서는 read를 통해 buf에 "LETMEWIN"을 넣어야하기 때문에 file descriptor를 조작해야한다. open이라던지 file descriptor를 생성하는 것이 없기 때문에 stdin으로 fd 값을 조작하여 입력을 받을 수 있다.
fd = stoi(argv[1]) - 0x1234의 값이 0이 되게 해야하므로 stoi(argv[1]) = 0x1234가 되는 값을 찾아야 한다.
python을 이용해 0x1234의 10진수 값을 찾았다.
0x1234의 10진수 : 4660
이 값을 fd 파일의 argument로 넣어주어 실행하면 입력을 받을 수 있게 되고 입력으로 "LETMEWIN"을 입력해 flag를 얻어낼 수 있었다.
************** Answer & Flag **************
1. fd를 stdin(0)으로 조작
argv[1]에 4660을 넣어주고 stdin으로 "LETMEWIN"을 넣어 flag를 획득했다.
Flag : mommy! I think I know what a file descriptor is!!
'Wargame > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] flag (0) | 2018.03.09 |
---|---|
[pwnable.kr] bof (0) | 2018.03.07 |
[pwnable.kr] collision (0) | 2018.03.02 |
[pwnable.kr] lotto 문제 풀이 (0) | 2017.08.27 |
[pwnable.kr] cmd1 문제 풀이 (0) | 2017.08.12 |