이 프로그램은 /home/flag14/flag14에 있습니다. 입력을 암호화하여 표준 출력에 기록합니다. 암호화된 토큰 파일도 해당 홈 디렉토리에 있으므로 해독하십시오 :) 이 수준을 수행하려면 암호 level14를 사용하여 level14 계정으로 로그인합니다. 이 수준의 파일은 /home/flag14에서 찾을 수 있습니다. 라고 나와있다. 결론은 무엇인가를 암호화된 토큰을 복호화하라는 것이다.
flag14 홈디렉터리를 보면 setuid 가 걸린 실행파일이랑 token 이 있다.
암호화된 토큰은 아래와같이 생겼고, setuid 가 설정된 바이너리를 실행하면 -e 플래그를 사용하면 암호화할수있다고 help 메시지가 출력된다
flag14 바이너리에 -e 옵션을 주어 실행하면 stdin 인풋창이나오는데, 여기서 입력한 값이 암호화되서 바로 아랫줄이 나옴.
abcde 가 암호화되서 acegi 가 나온것이고, asdfas 를 암호화해서 i|nm?asdfa 가 나온것임.
여기서 눈여겨보아야할 것은 제일처음에 입력한 값을 암호화환 값임.
echo "12345" | 로 12345 를 stdin 으로 보내면 13579
echo "abcdef" | 로 abcdef 를 stdin 으로 보내면 acehj 가 나옴.
잘보면 규칙이있는데, 문자열의 index 가 늘어날수록, 해당 index 에 위치하는 문자에다가 index 만큼의 가중치가 더해진다는 것임. 0000000 이 0123456 로 암호화되서 나오는 원리는 아래와 같음.
0 0 0 0 0 0 0 0
+0 +1 +2 +3 ........
0 1 2 3 4 5 6 7
여기서 내릴수있는 결로은 token 은 암호화된 문자열이기때문에, 이 암호화된 토큰에서 index 가중치만큼 다시 뺴주면 원문이 나올 것임. 따라서, 이 로직을 python 으로 간단하게 구현하면 암호화된 token 을 복호화해서 원문을 얻을 수 있음.
encString = open('/home/flag14/token').read().strip('\n')
result = [chr(ord(v) - i) for i, v in enumerate(encString)]
print("".join(result))
얻은 토큰으로 flag14 계정에 로그인하고 getflag 를 외치고 clear