슬라임이 맨 처음 문제이다.
저는 wsl을 사용을 하기 때문에, ssh fd@pwnable.kr -p2222 접속을 하고 시작하면 되겠습니다.
ls 명령어를 통해서, 현재 디렉토리에서 파일이 어떤 것이 있는지 확인을 합니다.
fd , fd.c , flag 파일이 있습니다. 어차피 cat flag 해도 flag는 출력이 안될것 같으니, 바로 소스코드를 확인을 했습니다.
system("/bin/cat flag"); 를 실행을 하도록 해당 조건문으로 진입을 하게 하면 될 것 같습니다.
여기서 이 코드들이 핵심입니다.
int fd = atoi( argv[1] ) - 0x1234;
int len = 0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf))
그렇다면, 문제를 해결 하기 위해서는 어떠한 지식이 필요할까요?
그냥 위에 코드가 해석이 가능하면 문제는 쉽게 해결이 가능합니다.
atoi(argv[1]) - 0x1234
argv는 사용자가 입력한 argument가 저장이 됩니다. 우리가 입력한 argument - 0x1234가 fd 변수에 넣습니다.
fd 변수는 read 함수에 파일 디스크립터로 사용이 되고 있습니다.
파일 디스크립터
프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값입니다.
프로그램이 프로세스로 메모리에서 실행될 때, 기본적으로 할당되는 파일디스크립터는
표준 입력 (standard input) 0
표준 출력 (standard output) 1
표준 에러 (standard error) 2
입니다. 이제 문제를 해결하기 위한 지식은 어느정도 공부했습니다.
atoi(argv[1]) - 0x1234 이 부분이 0이 되어야 하고, LETMEWIN이 있어야합니다.
0x1234는 decimal로 4660입니다.
그러면, 아래와 같이 한다면 플래그를 얻을 수 있습니다.