728x90
✏️ Check
문제에서 제공하는 ssh 로 접속하면 fd 문제 파일과 fd.c 소스코드 파일, 읽기 권한이 없는 flag 파일이 저장되어 있다.
🔎 Analyze
if(argc<2){
printf("pass argv[1] a number\n");
return 0;
}
int fd = atoi( argv[1] ) - 0x1234;
문제에서 제공한 소스코드를 확인해보면, argv[1] 를 가장 먼저 입력받는다.
입력받은 값은 문자열로 저장이 되고, 이를 atoi 함수를 통해 integer 값으로 변환하여 0x1234만큼 뺀 값을 fd 변수에 저장한다.
int len = 0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf)){
printf("good job :)\n");
system("/bin/cat flag");
exit(0);
}
앞서 저장한 fd 값은 read 함수에서 그대로 file descriptor로 사용된다.
* file descriptor
Unix 운영체제에서 파일이나 기타 입출력 자원에 접근할 때 사용하는 추상적인 표현이다.
주로 C 언어에서 integer(int) 유형으로 사용된다.
그 중에서도 0부터 2까지의 3 개의 정수 값은 그 의미가 고정되어 있다.
Integer Value Name <stdio.h> file stream 0 standard input stdin 1 standard output stdout 2 standard error stderr
그렇다면 사용자로부터 표준입력을 받음으로 실행흐름을 조작할 수 있으므로 (buf 변수에 직접 값을 쓸 수 있음) fd의 값이 0이 될 수 있도록 한다.
🔓 Exploit
0x1234를 decimal value로 바꿔주면 4660이 된다.
4660을 fd 파일의 인자로 전달하면 read 함수를 통해 buf 변수에 사용자로부터 표준입력을 받을 수 있게 되고, 이 때 "LETMEWIN"을 입력하면 flag를 출력할 수 있게 된다.
SMALL
'System > PWNABLE' 카테고리의 다른 글
[pwnable.xyz] add (0) | 2021.05.12 |
---|---|
[HackCTF] Register (0) | 2021.04.29 |
[ROP Emporium] write4 (재) (0) | 2021.04.17 |
[HackCTF] Unexploitable_1 (0) | 2021.04.17 |
[ROP Emporium] callme (0) | 2021.04.02 |