학사 나부랭이
CCE2021 Write up - ptmd 본문
이 문제는 TCP/UDP 프로토콜을 사용해 네트워크에 연결, 데이터를 읽고 쓰는 리눅스 명령어인 nc(NetCat)이 필요해요.
먼저, 터미널에서 nc 20.xxx.123.97 11111을 입력해 20.xxx.123.97의 11111포트에 접속해야죠.
그럼 stage 0부터 시작해 주어진 수식에 들어갈 연산자를 서버에 송신해야하며, stage 100까지 풀면 키가 나오고 한 문제를 푸는데 시간 제한도 있어요.
즉, 자동화하는 프로그램을 짜서 stage 100을 돌파하라는, 의도가 훤히 보이는 문제죠.
import socket
import re
def run():
#소켓 선언, with로 객체의 라이프사이클 관리(자동 생성, 자동 소멸)
#AF_INET: IPv4(xxx.xxx.xxx.xxx), SOCK_STREAM 소켓의 타입
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
#서버의 11111포트에 연결
s.connect(('20.xxx.123.97', 11111))
chk = 0
while(chk < 2):
#바이트 형태의 통신(서버의 메시지)을 받고, 문자열로 디코딩
resp = s.recv(1024).decode()
#102번째 메시지를 받았다면?
#if chk == 2: break
print(resp)
#서버의 메시지가 stage 100이 있다면? == 마지막 문제라면?
#if resp.find('stage 100') > -1: chk = 1
#마지막 문제가 지나갔다면? == 101번째 메시지(답이 들어있는)라면?
#if chk == 1: chk = 2
#서버의 메시지가 문제라면?
if resp.find('=') > -1:
#서버의 메시지에서
#'-'(1개 or 0개 존재), '숫자', '.'(1개 or 0개 존재), '숫자'(0~무한개 존재)
#형태의 원소들을 실수 형태의 배열로 num에 저장
num = [float(s) for s in re.findall(r'-?\d\.?\d*', resp)]
#stage 0의 경우, stage의 번호도 들어있더라고
#그래서 num이라는 배열이 3개(n1 ? n2 = n3)가 넘으면
if len(num) > 3:
#stage의 번호 삭제
for i in range(len(num) - 1):
num[i] = num[i + 1]
op = ''
if num[0] + num[1] == num[2]: op = '+'
elif num[0] - num[1] == num[2]: op = '-'
elif num[0] * num[1] == num[2]: op = '*'
elif num[0] / num[1] == num[2]: op = '/'
print(op)
#op를 바이트로 인코딩해서 서버에 전송
s.sendall(op.encode())
if __name__ == '__main__':
run()
답이 나오면 chk를 이용해 while문을 빠져나오려고 했는데 안 되더라고요. 고치기도 귀찮고 답은 나왔으니 그냥 Ctrl + C로 멈추고 스크롤해서 봤어요.
'自習 > 입해킹' 카테고리의 다른 글
'For you bro' SCAM (0) | 2022.02.08 |
---|---|
CCE2021 Write up - rox (0) | 2021.09.27 |
WannaCryptor ~SMB vulnerability (0) | 2021.06.30 |
ANOM ~Operation Trojan Sheild (0) | 2021.06.26 |
Comments