Bài viết này dùng để ghi lại các bước cơ bản để dễ dàng deploy một thử thách programming cho team nghiên cứu.
1. File Python
Chương trình chính cho thử thách
Dưới đây là chương trình mẫu cho thử thách tính cộng
sum.py
#!/usr/bin/python3
import random
def main():
print("Xin chào người chơi.")
print("Bạn học phép cộng ➕ rồi đúng chứ. Lấy máy tính ra đi nào.")
for i in range(2, 1000):
ints = []
sum = 0
for j in range(i):
rd = random.randint(100, 999)
ints.append(rd)
sum += rd
print(f"[+] Cho các số sau: {' '.join([str(int) for int in ints])}")
ans = input("[+] Tìm tổng: ")
if str(ans) == str(sum):
print("Đúng rồi. Thử lại nào.")
else :
print("Sai rồi, Tiếc quá.")
exit()
print("Cộng tốt đấy. Phần thưởng cho bạn đây: Flag{programming}")
if __name__ == '__main__':
main()
2. File script timeout
File script dùng tạo timeout cho kết nối, khi hết thời gian mà người chơi chưa giải được sẽ đóng kết nối.
timeout.sh
#!/bin/bash
# $1: timeout (5,10,12,..)
# $2: python file name (pro1.py, pro2.py,..)
timeout --signal=SIGKILL $1 stdbuf -i 0 -o 0 -e 0 /usr/bin/python3 $2
echo -e '\nTimeout!'
3. Tạo file service cho challenge
Tạo file service để chạy challenge như một dịch vụ trên linux
$ sudo cat >> /etc/systemd/system/pro.service
[Unit]
Description=Pro
[Service]
Type=simple
ExecStart=socat -v -dd TCP-LISTEN:28061,fork EXEC:"bash /home/debian/timeout.sh 30 /home/debian/sum.py"
Restart=always
[Install]
WantedBy=multi-user.target
^D
$ sudo systemctl daemon-reload
$ sudo systemctl restart pro.service
4. Kết quả
Dùng máy khác làm client để kiểm tra kết nối
$ nc <IP_ADDRESS> 28061
Xin chào người chơi.
Bạn học phép cộng ➕ rồi đúng chứ. Lấy máy tính ra đi nào.
[+] Cho các số sau: 670 821
[+] Tìm tổng: