Skip to content

Instantly share code, notes, and snippets.

@klustic
Created December 16, 2022 20:05
Show Gist options
  • Save klustic/002417a8cac7998a2b28265f52d2cc38 to your computer and use it in GitHub Desktop.
Save klustic/002417a8cac7998a2b28265f52d2cc38 to your computer and use it in GitHub Desktop.
Bongcloud CTF challenge
package main
import (
"errors"
"fmt"
"net"
"time"
)
type ChessState struct {
MoveNumber int
}
func (s *ChessState) NextMove() (move string, err error) {
if s.MoveNumber == 0 {
s.MoveNumber += 1
return "e4", nil
} else if s.MoveNumber == 1 {
s.MoveNumber += 1
return "Ke2", nil
} else {
return "", errors.New("No more moves needed")
}
}
func SendString(conn net.Conn, s string) error {
data := []byte(s)
for i := range data {
n, err := conn.Write(data[i : i+1])
if n != 1 || err != nil {
return errors.New("socket is donezo")
}
time.Sleep(50 * time.Millisecond)
}
return nil
}
func handleConnection(conn net.Conn) {
defer conn.Close()
state := ChessState{MoveNumber: 0}
if SendString(conn, "Welcome to BSides Chess! Let's play! I'll play as white. Here goes!") != nil {
return
}
time.Sleep(2 * time.Second)
if SendString(conn, "\n\n") != nil {
return
}
for {
move, err := state.NextMove()
if err != nil {
SendString(conn, "\n\nSay it ain't so... It's too much! I resign!")
return
}
if SendString(conn, fmt.Sprintf("%d: %s\n ", state.MoveNumber, move)) != nil {
return
}
recvData := make([]byte, 5)
conn.Read(recvData)
}
}
func main() {
ln, err := net.Listen("tcp", ":8888")
if err != nil {
return
}
for {
conn, err := ln.Accept()
if err != nil {
return
}
go handleConnection(conn)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment