728x90
이번 포스트에서는 Pwnable의 fd 문제에 대해 다루겠다.
문제 코드는 다음과 같다.
#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;
}
## 문제 해석 :
문제 코드를 살펴 보니, 우리가 기입한 첫 번째 argv에 0x1234를 뺀 후의 값이 file descriptor 값이 되어 read() 함수에 들어간다.
또한 read() 함수에 저장 된 buf의 값 중 "LETMEWIN"과 같다면 Flag를 획득할 수 있는 것으로 보인다.
## 문제 풀이 :
먼저 File Descriptor에 대한 정의를 정리하겠다.
번호 | 설명 | 이름 | 파일스트립 |
0 | 표준 입력 | STDIN_FILENO | stdin |
1 | 표준 출력 | STDOUT_FILENO | stdout |
2 | 표준 에러 | STDERR_FILENO | stderr |
여기서 우리는 표준 입력을 통해 "LETMEWIN"을 입력하므로써 문제를 풀어보도록 하겠다.
0x1234의 10진수 값이 4660이기 때문에 4660을 그대로 argument로 넣으면 4660(0x1234) - 0x1234 = 0이 성립하므로 우리가 원하는 표준입력(0)을 얻을 수 있다.
## 최종 결과 :
Flag = mommy! I think I know what a file descriptor is!!
'Wargame > Pwnable' 카테고리의 다른 글
Pwnable (6. random) (0) | 2022.07.04 |
---|---|
Pwnable (5. passcode) (0) | 2022.07.03 |
Pwnable (4. flag) (0) | 2022.07.02 |
Pwnable (3. bof) (0) | 2022.06.22 |
Pwnable (2. collision) (0) | 2022.06.19 |