# 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)
}
```