2020년에 진행된 국정원 주최 사이버공격방어대회
오랫동안 컴퓨터에 당시 문제들을 묵혀놨다가 이제야 풀이 포스팅을 해본다.
당시는 거의 이런 대회에 나가본게 처음이라, 시간에 쫒겨서 캡쳐를 제대로 못한 부분이 많다.
Simple Packet 문제에서는 세 가지 파일이 주어진다.
client.py / server.py / simple_packet.pcapng 파일이다.
#!python3
from socket import *
import sys
def do_xor(data):
key = b"\x10\x07\x19"
return bytearray([data[i] ^ key[i%3] for i in range(len(data))])
if len(sys.argv) != 2:
print('[-] usage : {} server'.format(sys.argv[0]))
sys.exit(-1)
host = sys.argv[1]
s = socket(AF_INET, SOCK_STREAM)
s.connect((host, 9999))
userInput = input("input : ")
s.send(do_xor(userInput.encode()))
data = s.recv(1024)
dec = do_xor(data)
print(dec)
s.close()
먼저 client.py 패킷의 내용이다.
\x10\x07\x19 3바이트를 key 값으로 해서 xor 연산을 하는 함수가 보이고,
사용자에게 입력을 받아 xor을 수행한 뒤 서버로 전송하는 모습이다.
서버는 9999번 포트를 사용하고 있고,
서버에서 받은 응답을 다시 xor 해서 print(dex)로 출력해준다.
#!python3
import socketserver
def do_xor(data):
key = b"\x10\x07\x19"
return bytearray([data[i] ^ key[i%3] for i in range(len(data))])
def win():
with open('flag.txt', 'r') as f:
return f.read()
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
s = self.request
data = s.recv(1024)
ddata = do_xor(data)
print(b'from client : ', ddata)
if ddata == b'Hell, World':
s.send(do_xor(win().encode()))
s.close()
if __name__ == "__main__":
HOST, PORT = "0.0.0.0", 9999
try:
socketserver.TCPServer.allow_reuse_address = True
server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
except:
server.server_close()
이번엔 server.py 의 내용이다.
마찬가지로 \x10\x07\x19 를 xor key 값으로 사용하고 있다.
중간에 조건문이 보이는데,
client로 부터 받은 데이터가 'Hell, World' 와 일치한다면,
win() 함수가 실행되고 있다.
win() 함수는 flag.txt 파일의 내용을 읽어 출력시켜주는 역할을 한다.
여기서도 서버가 9999포트를 이용하고 있는것이 보인다.
마지막으로 simple_packet.pcapng 파일이다.
pcapng 파일은 Wireshark 라는 도구를 이용해 열어볼 수 있다.
패킷이 갯수가 그렇게 많지 않아서,
천천히 내리면서 살펴보면 9999번 포트와 통신한 기록을 쉽게 찾을 수 있다.
해당 패킷에서 우클릭 - Follow - TCP Stream 을 눌러주면
전송한 내용을 자세히 볼 수 있다.
이런 데이터를 전송한것이 보이는데,
아까 소스코드에서 xor을 하고 있었으니
다시한번 xor을 해서 복호화를 해본다.
Show and save data as 를 Raw 로 선택해서 16진수 값으로 만든 뒤
파란색 부분을 복사해준다.
CyberChef(https://gchq.github.io/CyberChef)에서 복사한 값을 붙혀준 뒤 From Hex, XOR 레시피를 선택하고,
XOR 키값에 100719를 넣어주면 플래그를 찾을 수 있다.
'CTF > 포렌식' 카테고리의 다른 글
[2020CCE] Webpacket - 포렌식 / Wireshark / XOR (62) | 2022.10.30 |
---|---|
[2020CCE] Web Log - 포렌식 / Blind SQL Injection (54) | 2022.10.28 |
[2020CCE] Simple Memory - 포렌식 / Volatility (60) | 2022.10.22 |
[2020CCE] Keyboord - 포렌식 / Wireshark / Python (56) | 2022.10.20 |
[2020CCE] Simple Carv - 포렌식 / FTK Imager (29) | 2022.10.18 |