### Reply Cyber Security Challenge - Treasure Island

ppc
tags: ctf challenge write-up coding
by GaspareG

In another folder, there’s a treasure map, containing lots of “ARR!” and a lot of rubbish. R-Boy wonders if the number of occurrences of the string in the 8 directions can unlock a hidden message… Look at the map and help R-Boy find the hidden word. Note: to complete the flag, insert the found message between “{FLG:” and “}” without any blank spaces after the “:” or before the “}”.”

The challenge provide us a .txt file with `30000` strings (each of them of length `30000`).

As written in the text, we have simply to count the number of occurences of the string “ARR!” in the file. We can count them with a simple program that, for each starting point, looks in all the 8 directions.

So the total number of occurences is `47723067`.

We lost some time trying to figure out how to use that number to find the “hidden message”. In the end, after many attemps, we simply converted the number from hex (`47723067`) to ascii (`Gr0g`).

ARR! The pirates love the grog!

Then finally the searched flag is: `{FLG:Gr0g}`

Source code:

``````#include <bits/stdc++.h>

using namespace std;

int main()
{
vector<string> lines;
string arr = "ARR!";

ifstream file;
string line;
file.open("island.txt");
while (getline(file, line)) lines.push_back(string(line));

long long cont = 0;

for (auto i = 0; i < lines.size(); i++)
{
int s = lines[i].size();

for (auto j = 0; j < s; j++)
{
if (lines[i][j] != 'A') continue;

for(int x = -1; x < 2; x++)
for(int y = -1; y < 2; y++)
{
bool f=true;
for(int z=0; z<4; z++)
{
if(i+z*x < 0) f = false;
else if(i+z*x >= s) f = false;
else if(j+z*y < 0) f = false;
else if(j+z*y >= s) f = false;
else f = f && ( lines[i+z*x][j+z*y] == arr[z] );
}
cont += f;
}
}
}

cout << cont << endl;

return 0;
}
``````