본문 바로가기
포너블(pwnable)/CTF(pwnable.kr)

[Toddler's Bottle] input 문제풀이

by LIZ0904 2021. 4. 7.
반응형

문제

오늘의 문제는 뭔소린지 잘 모르겠으니 우선 문제에 접속해보자!

 

 

 

문제 접속

문제에 접속하고 나서, ls 명령을 사용해 디렉터리 안에 어떤 파일들이 있는지 확인해봤다. input.c 파일을 확인해보자!

 

 

 

cat input.c

cat 명령을 이용해 input.c 의 내용을 확인해보았다. 지금까지 봤던 문제 중 가장 긴 main함수 인 것 같다...;;

우선 main함수의 첫부분에서 printf문으로 옳은 input을 입력하면, 플래그를 얻을 수 있다는 내용을 출력하고 있다.

각 주석처리 된 부분의 if문들을 통과하고 나면 stage1~5까지를 clear할 수 있다.

stage 1~5를 통과해야지만, 마지막의 system("/bin/cat flag")명령을 실행해 flag를 얻을 수 있다.

 

 

 

stage 1의 조건

Stage1의 조건(argv)를 확인해보자!

첫번째 if문에서는 입력값의 개수를 정의해주고 있다.

두번째, 세번째 명령은 strcmp함수를 통해 입력값 중 'A','B'번째의 값을 정의해주고 있다.

strcmp명령은 같으면 0을 반환하고, 다르면 0이 아닌 값(음수/양수)을 반환한다. 그러므로 strcmp값이 다르면 0이 아닌 값이 반환되어 if문이 참이 되므로, return 0이 실행되게 된다. 즉, strcmp 값이 같아야 한다.

 

첫번째 if문: argc(입력 값의 개수) = 100
두번째 if문:  argv['A'] = \x00
세번째 if문:  argv['B'] = \x20\x0a\x0d

Stage1의 조건을 정리하면 위와 같다.

 

 

 

 

stage 2

Stage2의 조건(stdio)을 보면, read함수를 통해 buf을 읽어보고, buf의 내용을 확인해본다. 

pwnable.kr의 문제 중 fd 문제를 통해 read 함수를 다뤄봤던 적이 있다.

memcmp함수는 strcmp와 비슷한데, memcmp(*ptr1, *ptr2, num)의 형식을 갖고 있다. 즉, ptr1(메모리 블록을 가리키는 포인터1)이 가리키는 처음 num(비교할 바이트 수)바이트의 데이터와 ptr2가 가리키는 num바이트의 데이터를 비교해, 같으면 0, 다르면 0이 아닌 값을 반환한다.

첫번째 if문에서, buf의 0~4시발?

 

 

Stage2의 조건을 정리하면 위와 같다. 

 

 

 

 

stage 3

Stage3의 조건은 env, 즉 환경변수에 관련한 내용이다.

getenv를 사용해 "\xde\xad\xbe\xef" 환경변수의 값을 가져오고, 이를 "\xca\xfe\xba\xbe"와 비교하고 있다. 이 두 값이 같아야지, if문이 실행되지 않고 stage3를 통과할 수 있다.

 

환경변수 \xde\xad\xbe\xef" = "\xca\xfe\xba\xbe"

Stage3의 조건은 위와 같다.

 

 

 

 

stage 4

stage4는 \x0a라는 파일을 열어서 확인하는 작업을 진행한다. 이때, \x0a 파일을 가리키는 포인터는 fp이다.

fread 함수는 fread(void* ptr, size_t size, size_t count, FILE* stream)의 형식을 갖는다. ptr은 size x count의 크기를 갖는 배열을 가리키는 포인터, size는 읽어들일 원소의 크기(바이트)를 의미한다. 예를 들어 size=4이면, 하나의 원소의 크기는 4바이트 임을 일컫는다. count는 읽어들일 원소의 개수(바이트), stream은 데이터를 입력받을 스트림의 file 객체를 가리키는 포인터를 의미한다.

첫번째 if문에서 fp는 비어있음을 안됨을 의미한다.

두번째 if문에서는 fp가 가리키고 있는 파일 내용 중 4바이트 만큼의 원소 1개를 buf에 넣는다.

세번째 if문에서는 buf의 4바이트가 "\x00\x00\x00\x00"이어야 함을 나타낸다.

 

\x0a 라는 파일의 첫 4바이트가 "\x00\x00\x00\x00"이어야 함

stage4의 조건을 정리하면 위와 같다.

 

 

 

stage 5

Stage 5는 네트워크 관련 조건이다.

첫번째 if문에서 sd는 -1이 아니어야 함을 알 수 있다.

두번째 if문 직전의 saddr.sin_port = htons( atoi(argv['C']) ); 부분 명령을  살펴보자.

 

 

 

 

flag 값

 

아~~~시발~~~~~~~~~못풀겠다~~~~~~

반응형

댓글