관리 메뉴

IT창고

[Toddler's Bottle] fd 본문

WarGame/pwnable.kr

[Toddler's Bottle] fd

방구석여포 2018. 3. 3. 22:07

fd문제를 풀이하기 전 pwnable.kr에 대해 알아보겠습니다.



pwnable.kr은 한국인이 만든 워게임 사이트로 시스템쪽으로 배워볼수있습니다.

첫문제인 fd에 대해 알아보겠습니다.



링크된 동영상은 현재 사라진상태이기 때문에 확인해볼수는 없지만 1점 짜리 문제입니다. 동영상없이도 충분히 풀어볼수있습니다.



문제의 소스코드를 살펴봅니다.

전역변수로 버퍼[32]만큼 잡아주고 인자하나를 넣어야하네요.

system("/bin/cat flag"); 를 실행시켜 flag값을 알아내는것이 목표입니다.


int fd = atoi( argv[1] ) - 0x1234;

이 코드는 argv[1]에 값에서 - 0x1234를 뺀값이 fd이네요


len = read(fd, buf, 32);

read함수는 파일을 읽는 함수입니다.

fd가 파일디스크립터 라는걸 알수있습니다.

파일 디스크립터(File Descriptor)란 시스템이 할당한 파일이나 소켓을 대표하는 정수로서 이 정수를 이용해서 파일에 접근하거나 제어할 수 있습니다.

표준 입력 : 0

표준 출력 : 1

표준 에러 출력 : 2


표준입력이 되기위해 0을 넣어줘야합니다. 그렇다면 0x1234를 계산기로 10진수로 바꿔본다면 숫자는 4660이 나옵니다.

바로 printf("learn about Linux file IO\n"); 넘어가지 않고 표준입력상태로 전환됩니다.

이제 if(!strcmp("LETMEWIN\n", buf)) 코드를 확인하면 buf에 LETMEWIN가 있다면 아래의 코드가 작동되게됩니다.

if(!strcmp("LETMEWIN\n", buf)){

printf("good job :)\n");

system("/bin/cat flag");

exit(0);

}

그렇다면 system("/bin/cat flag"); 코드가 동작해서 원하는 결과를 넣을수있을거같습니다.


system("/bin/cat flag"); 코드가 정상적으로 작동해서 flag파일의 내용을 확인해볼수있습니다!

저는 이문제를 먼저 풀어보고 답을 확인했기 때문에 You already authenticated this flag라고 뜨지만 flag답임을 확인할수있습니다.


Comments