본문 바로가기

5. 방학 활동/Write UP

[2023.02.11] 워게임&CTF 스터디 1팀 문제풀이(포너블(1))]

#1_fd

파일 디스크립터를 알아내는 문제입니다.

 

putty를 사용하여 로그인을 합니다.

 

아무런 정보가 없기 때문에 어떤 파일이 존재하는지 확인하기 위해 ls-l을 사용합니다.

fd, fd.c, flag 파일이 존재하는 것을 볼 수 있습니다.

여기서 fd.c 파일을 읽기 위해 cat을 사용합니다.

 

첫 번째 if문의 코드가 인자가 없을 경우 pass argv[1] a number\n을 출력하라는 의미입니다.

그러므로 인자를 하나 이상 넣어 다음 코드가 실행되게 해야 합니다.

앞에 !가 붙어 있으므로 같으면 1이 나옵니다.

LETMEWIN/n과 buf를 같게 만들어 if문을 참으로 만들어야 합니다.

따라서 fd의 값이 0이 되어야 합니다.

0x1234는 10진수로 4660과 같아서 인자 값으로 4660을 넣어주면 입력을 기다리고 있음을 알 수 있습니다.

 

LETMEWIN을 입력하면 플래그가 나오는 것을 볼 수 있습니다.

 

 

#2_collision

문제에서 MD5 hash collision을 구해야 합니다.

 

putty를 사용하여 열어보았더니 디렉터리의 파일을 볼 수 있습니다.

 

16개의 파일이 나왔고, cat 명령어를 통해 col.c를 보았습니다.

여기서 main 함수부터 보면 첫 번째 if 문에서 인자 값 argc의 개수가 2개 이상이어야 합니다.

두 번째에서는 인자 값 argv[1]의 길이가 20바이트여야한다는 것을 알 수 있습니다.

세 번째 if 문에서는 해시코드와 check_password 함수의 결과 값이 같을 경우 플래그를 얻을 수 있습니다.

check_password 함수를 확인해보면 const char* p로 문자열을 인자로 받습니다. p의 주소값을 int형 포인터 변수 ip에 넣습니다. int형 변수 resip[0]~ip[4] 값의 총합을 넣습니다. 이때 ipint형이기 때문에 4바이트 단위로 5개의 문자열을 더하는 것입니다. 따라서 해시코드와 check_password 함수값이 같으려면 5개의 문자열의 합이 해시코드와 같아야 합니다.

21DD09EC10진수로 568134124 이며, 5의 배수가 아니기 때문에 4개의 같은 문자와 마지막 문자에 나머지가 합해진다는 것을 알 수 있습니다. 6c5cec8 4개와 6c5cecc의 합을 입력해 보았습니다.

 

이렇게 플래그가 나옵니다.