210_
2019. 6. 14. 22:41
fd
Mommy! what is a file descriptor in Linux?
* try to play the wargame your self but if you are ABSOLUTE beginner, follow this tutorial link:
https://youtu.be/971eZhMHQQw
ssh fd@pwnable.kr -p2222 (pw:guest)
pwnable.kr 첫번째 문제인 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;
}
10번째 줄에서 atoi 함수에 의해 argv[1]에서 입력한 값을 정수로 바꿔서 0x1234를 뺀 다음, fd에 대입해보자.
int fd = atoi( argv[1] ) - 0x1234;
그리고 read(fd, buf, 32); 로 read함수가 호출되는데 이때 fd가 0이면 표준 입력 으로 적용되기 때문에 buf에 값을 입력할 수 있다.
len = read(fd, buf, 32); // 여기서 fd가 0이면 표준 입력.
Attack Vector
- argv[1]에 0x1234를 입력하여 fd값을 0으로 만듬.
- read함수가 실행되면 if문에 성립하게끔 "LETMEWIN"을 입력함.
- 플래그 개이득 잔치~
fd@ubuntu:~$ ./fd 4660
LETMEWIN
good job :)
mommy! I think I know what a file descriptor is!!
왜 argv[1]에 4660?
-> 0x1234 == 4660