Pwnable/Pwnable.kr
pwnable.kr - 1 - fd
KSJ._.seven11
2023. 1. 25. 12:09
문제의 소스코드는 다음과 같다.
#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;
}
버퍼에 크기는 32Byte 이며 argc < 2 보다 작을때 다시 시도하게 한다.
입력받은 fd 값에 - 0x1234 를 빼야 한다.
C언어 atoi 함수는 Ascii to int 를 뜻하며 아스키 코드를 정수형 값으로 변환해 준다.
Read 함수에서 첫번째 인자 fd에 0이란 값이 들어가 표준입력으로 인식된다. ( 변수 len == 0;)
즉 키보드로 입력하는 buf 안에 값을 저장하게 된다.
이후 LETMEWIN\n 문자열과 Buf 를 비교하여 참이되어 1이 출력될 경우 flag를 획들 할 수 있는 구조다.
먼저 16진수 0x1234를 10진수 계산기로 계산하면 4660이 된다.
argc 1번째 값에 4660을 넣어 실행시킨다면 fd 값이 0이 될 것이다.
--> LETMEWIN 문자열을 입력하여 buf와 비교하고 1이 출력되어 플래그를 출력할 수 있을 것이다.
그렇게 플래그를 획득 할 수 있다.