Skip to main content

Phase 3 (75 pts)

This is a little more challenging but still nonetheless manageable.

Problem Statement

Reflections? Rotations? Translations? This is starting to sound like geometry...

Author: treap_treap


Sounds complex. Let's look at it using Ghidra.


bool phase3(undefined8 param_1,undefined4 param_2,undefined4 param_3,undefined4 param_4,
undefined4 param_5,undefined4 param_6,undefined4 param_7,undefined4 param_8,char *param_9

int strCmpRes;
char *__s1;
char *outputStr;
undefined8 in_R8;
undefined8 in_R9;
undefined4 extraout_XMM0_Da;
undefined in_stack_ffffffffffffffc8;
char *inputPtr;

puts("\nReflections? Rotations? Translations? This is starting to sound like geometry...");
__s1 = (char *)calloc(0x29,1);
inputPtr = __s1;
while (*inputPtr != '\0') {
outputStr = func3_1(inputPtr);
*inputPtr = *outputStr;
outputStr = func3_2(inputPtr);
*inputPtr = *outputStr;
inputPtr = inputPtr + 1;
strCmpRes = strcmp(__s1,"\"_9~Jb0!=A`G!06qfc8\'_20uf6`2%7");
return strCmpRes == 0;


Initially, I had spent a huge amount of time trying to reverse the functions by coding a Python script to attempt to go backwards from the given string back to the flag.

However, I realise that it might not be an onto function, where every output can easily be mapped back to the original flag.

Hence, I decided to replicate the 2 functions in Python and brute force the flag using the 127 different characters in ASCII.

target = "\"_9~Jb0!=A`G!06qfc8\'_20uf6`2%7"
flag = ""

for c in target:
for i in range(1, 128):
tmp = i
# Function3_1
if tmp > ord('@') and tmp < ord('['):
tmp -= 0xd
if tmp < ord('A'):
tmp += 0x1a

if tmp > ord('`') and tmp < ord('{'):
tmp -= 0xd
if tmp < ord('a'):
tmp += 0x1a

# Function3_2
if tmp > ord(' ') and tmp != 0x7f:
tmp -= 0x2f
if tmp < ord('!'):
tmp += ord('^')

if (chr(tmp) == c):
flag += chr(i)