# REVERSE-3 Оценка: 30 ## Описание В данном задании необходимо выполнить обратную разработку и получить флаг с сервера. Подключение с помощью клиента: ./game_client [Файл №1](https://github.com/dered-cybersecurity/nto_2023/blob/main/1-offensive/REVERSE-3/2e52f19e-283f-45c8-b2c1-ffb51125b4ae_game_client) ## Решение Задача участиника изучить функции генерирования ориентированного графа и найти функции сетевого взаимодействия. В предоставленном бинарном файле *task/client* клиента присутствует отладочная информация, следовательно, поиск сетевых функций, как и функций работы с графом, значительно упрощается. Исследовав любую сетевую функцию, получаем, что запрос на сервер имеет вид: ```go type Query struct{ action string identifier string // uuid пользователя room_id string // uuid комнаты payload string } ``` А также отправляется на порт 1337, используя TCP. Далее участнику остается написать или воспользоваться готовой реализацией алгоритма Дейкстры для нахождения кратчайшего пути от 0 до 14999 вершины. ### Пояснение Если участник отправит на сервер запрос с некорректным action, сервер вернет все допустимые action, среди которых будет debuggame. Благодаря этому действию, можно сильно сократить время выполнения скрипта. Если в процессе решения задачи участник на этапе завершения игры 2000 раз подряд запросит у сервера флаг, то он также сможет получить флаг, однако, он должен успеть это сделать до удаления комнаты. ### Эксплоит *spl/main.go* ```go package main import ( "fmt" gg "sploit/bad_graph" badio "sploit/servertcpio" "gonum.org/v1/gonum/graph/path" "gonum.org/v1/gonum/graph/simple" ) const server_addr = "localhost:4444" func BetterGraph(g gg.Graph) *simple.DirectedGraph { arr := g.Matrix.Arr ret := simple.NewDirectedGraph() for i := 0; i < len(arr); i++ { for k := range arr[i] { if arr[i][k] == 1 { ret.SetEdge(simple.Edge{F: simple.Node(i), T: simple.Node(k)}) } } } return ret } func main() { var con badio.Con err := con.Init(server_addr) if err != nil { panic(err) } con.Register() con.JoinRoom() for !con.ReciveStart() { } seed := con.GetSeed() var game_graph gg.Graph game_graph.Init(15000, seed, 10) bettergraph := BetterGraph(game_graph) pth := path.DijkstraFrom(simple.Node(0), bettergraph) end, _ := pth.To(14999) ans := make([]int, 0) for _, i := range end { ans = append(ans, int(i.ID())) } if len(ans) == 0 { } con.SendAns(ans) for !con.IsEnded() { } cur := con.GetANS() fmt.Println(cur) } ```