pwnable 1번 문제를 풀어보자.
먼저 디렉토리에 있는 파일목록, 권한을 본다.
fd@ubuntu:~$ 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
fd.c를 읽어보면
fd@ubuntu:~$ cat 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;
}
Linux file IO에 대해 공부하라는 문구와 문자열 정수를 정수로 바꾸는 atoi(argv[1]) 함수와
file descriptor를 이용해 파일을 읽는 read(fd, buf, 32); 함수가 있었다.
read(fd, buf, 32); 의 파라미터 fd는 open한 파일의 descriptor를 나타내며 buf는 읽을 데이터를 저장할 메모리 영역이다
그리고 32는 count값으로 읽을 size이다.
파일 디스크립터 값이 미리 정해져있는 0 : 표준 입력(stdin) 1 : 표준 출력(stdout) 2 : 표준 오류(stderr)는 있는데,
다음 3가지는 서로다른 프로세스라도 다 같은 값이다. 그렇기 때문에 파일을 열어도 파일 디스크립터는 3번부터 시작한다.
0x1234를 10진수로 바꾸면 4660이고 argv[1]에 4660을 넣어준다.
그 다음에 LEMEWIN을 입력해주면 플래그값이 뜬다.
fd@ubuntu:~$ ./fd 4660
LETMEWIN
good job :)
mommy! I think I know what a file descriptor is!!
'System Hacking > pwable.kr' 카테고리의 다른 글
06.Pwnable random (0) | 2018.02.15 |
---|---|
05.Pwnable passcode (0) | 2018.02.15 |
04.Pwnable flag (0) | 2018.02.13 |
03.Pwnable bof (0) | 2018.02.13 |
02.Pwnable col (0) | 2017.11.23 |