This binary has an initialisation routine which involves printing :3 followed by calling exit(). We can bypass the exit() call and allow the program to continue running by patching the call to exit() with some other instruction such as a jmp. This allows the program to continue executing the main function.
Essentially, the local variables represent the bytecode to be executed. The bytecode first undergoes an XOR decryption operation, then the bytecode is loaded into the memory at the address puVar1 and executed.
I then set a breakpoint at the line where the bytecode is executed to see what the bytecode does. The bytecode basically writes characters into the stack then slowly decrypts them, giving us the flag: akasec{sh1tty_p4ck3d_b1n4ry}