워게임/247CTF

[247CTF] THE FLAG LOTTERY - MISC / Python

SecurityMan 2023. 10. 12. 11:00

 247CTF 에서 제공하는

 

EASY 난이도의 MISC 문제

 

MISC는 miscellaneous의 약자로 여러가지 잡다한 이라는 의미를 가지고 있다.

 

반응형

 

문제 설명을 읽어보면

 

특정 숫자를 맞춰야만 플래그를 얻을 수 있는것 같다.

 

import SocketServer, threading, random, time

class ThreadedLotteryServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass

class LotteryHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        secret = random.Random()
        secret.seed(int(time.time())) 
        winning_choice = str(secret.random())
        self.request.sendall("Can you guess the number to win the flag lottery?\n")
        your_choice = self.request.recv(1024).strip()
        if winning_choice == your_choice:
            self.request.sendall("Congratulations you won the lottery! Have a flag!\n")
            self.request.sendall("%s\n" % open('flag.txt').readline().rstrip())
        else:
            self.request.sendall("Nope! The winning number was %s, better luck next time!\n" % winning_choice)
        return

if __name__ == '__main__':
    SocketServer.TCPServer.allow_reuse_address = True
    server = ThreadedLotteryServer(("0.0.0.0", 5000), LotteryHandler)
    server_thread = threading.Thread(target=server.serve_forever)
    server_thread.daemon = True
    server_thread.start()
    server.serve_forever()

 

파이썬 코드와 함께

 

서버 주소/포트가 주어진다.

 

코드를 보면

 

time 을 시드로 해서 랜덤한 값을 생성하는데,

 

이 값을 맞춰야만 플래그를 획득할 수 있다.

 

 

시험삼아 nc를 이용해 접속해봤는데

 

맞춰야 하는 숫자가

 

소수점 12자리의 소수였다..

 

이걸 때려맞춘다는 것은 불가능하기 때문에

 

다른 꼼수를 써야만 한다.

 

생각해낸게

 

time 을 시드로 랜덤한 값을 만들고 있으니,

 

서버의 코드와 똑같은 코드를 작성해

 

요청할 때 보내버리면 되지 않을까 싶었다.

 

import socket, random, time

hostname = '도메인'
port = 포트

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((hostname, port))
data = s.recv(1024)
print(data)

secret = random.Random()
secret.seed(int(time.time())) 
winning_choice = str(round(secret.random(),12))
s.sendall(bytes(winning_choice.encode("utf-8")))
print(winning_choice)

data = s.recv(1024)
print(data)
data = s.recv(1024)
print(data)

s.close()

 

Python 을 이용해 이렇게 작성할 수 있다.

 

소캣을 생성하고,

 

문제에서 주어진 코드와 같이

 

winning_choice 값을 생성한 뒤 보낸 뒤

 

결과값을 확인하는 것이다.

 

 

코드를 실행시키면

 

플래그를 획득할 수 있다.

반응형